Как мне сделать memset для указателя на массив?
int (*p)[2];
p=(int(*))malloc(sizeof(*p)*100);
memset(p,0,sizeof(*p)*100);
Это распределение правильно?
ты можешь использовать calloc
,
calloc
заменит оба malloc
а также memset
,
p = calloc(100, sizeof (*p));
Я суммирую много ответов (хотя я проигнорировал некоторые стилистические варианты в пользу моих собственных предпочтений).
В С:
Как использовать malloc:
int (*p)[2] = malloc(100 * sizeof(*p));
Как использовать memset:
memset(p, 0, 100 * sizeof(*p));
Как сделать оба в одном утверждении:
int (*p)[2] = calloc(100, sizeof(*p));
В C ++ возможно то же самое, за исключением того, что вам нужно привести результаты malloc
а также calloc
: static_cast<int(*)[2]>(std::malloc(100 * sizeof(*p))
,
Тем не менее, C ++ предоставляет альтернативные способы выделить это:
int (*p)[2] = new int[100][2](); // like calloc.
delete[] p; // *not* delete p
C ++ также обеспечивает vector
, что, как правило, хорошо, но, к сожалению, вы не можете создать вектор массивов в стиле C. В C ++ 03 вы можете обойти это так:
struct my_array {
int data[2];
};
std::vector<my_array> p(100);
// no need to free/delete anything
Я не думаю, что обнуляет элементы, хотя я могу ошибаться. Если я прав, то к нулю нужно:
my_array initvalue = {0};
std::vector<my_array> p(100, initvalue);
Другой способ представить 2 целых:
std::vector<std::pair<int,int> > p(100);
Если вы можете использовать Boost:
std::vector<boost::array<int, 2> > p(100);
В C ++ 11:
std::vector<std::array<int, 2>> p(100);
Я перечислил их в порядке возрастания того, насколько хорошо они обычно так что используйте последний, который не заблокирован какими-либо ограничениями, над которыми вы работаете. Например, если вы ожидаете взять указатель на первый элемент одного из внутренних массивов-2-int и увеличить его, чтобы получить указатель на второй, то std::pair
отсутствует, потому что это не гарантирует, что работает.
Элегантный способ:
typedef int int_arr_2[2];
int_arr_2* p;
p = malloc(sizeof(int_arr_2)*100);
memset(p,0,sizeof(int_arr_2)*100);
Лучший способ:
typedef int int_arr_2[2];
int_arr_2* p;
p = calloc(100, sizeof(int_arr_2));
calloc, в отличие от malloc, гарантирует, что все байты установлены в ноль.
memset()
линия правильная.
Для тебя не нужен кастинг malloc.
В C ++, если вы все еще хотите это сделать, приведение типа должно быть следующим:
p = (int(*)[2]) malloc(sizeof(*p)*100); // or `static_cast<...>
// ^^^^^^^^^
Но я бы предложил изменить ваш подход к использованию std::vector
вместо. Чище, лучше и «полуавтоматически»:
std::vector<int*> vi(100); // or std::vector vi(100, nullptr);
Другой способ с необработанными указателями — использовать new[]
:
int **p = new[100](); // allocates and sets to 0
Но вы должны управлять этой памятью позже, delete[]
В C (не C ++) вы бы просто сделать
int (*p)[2] = malloc(sizeof(*p)*100);
memset(*p,0,sizeof(*p)*100);
переменные могут быть инициализированы с помощью выражений и malloc
не нуждается (и не должен иметь) актерский состав. затем *p
является «lvalue» вашего типа массива, который распадается на указатель при передаче memset
,