Как мне сделать memset для указателя на массив?

Как мне сделать memset для указателя на массив?

int (*p)[2];

p=(int(*))malloc(sizeof(*p)*100);

memset(p,0,sizeof(*p)*100);

Это распределение правильно?

1

Решение

ты можешь использовать calloc,

calloc заменит оба malloc а также memset,

p = calloc(100, sizeof (*p));
7

Другие решения

Я суммирую много ответов (хотя я проигнорировал некоторые стилистические варианты в пользу моих собственных предпочтений).

В С:

Как использовать 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 отсутствует, потому что это не гарантирует, что работает.

1

Элегантный способ:

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, гарантирует, что все байты установлены в ноль.

1

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[]

0

В C (не C ++) вы бы просто сделать

int (*p)[2] = malloc(sizeof(*p)*100);

memset(*p,0,sizeof(*p)*100);

переменные могут быть инициализированы с помощью выражений и malloc не нуждается (и не должен иметь) актерский состав. затем *p является «lvalue» вашего типа массива, который распадается на указатель при передаче memset,

0
По вопросам рекламы [email protected]