как инициализировать массив указателей на структуру в ноль - PullRequest
1 голос
/ 03 января 2012

Я выделяю память для массива указателей для структурирования через malloc и хочу инициализировать его нулем, как указано ниже.Предполагая, что структура содержит член типа int и char [] (строки)?так как я могу обнулить эту структуру.

Код: предположим, что я хочу выделить 100

struct A **a = NULL;
a = (struct **)malloc(sizeof( (*a) * 100);
for(i=1; i < 100; i++)
     a[i] = (struct A*)malloc(sizeof(a));

Также, пожалуйста, объясните мне, почему необходимо инициализировать с нуля.

Платформа: Linux, Язык программирования: C

Я знаю, что мы можем использовать memset или bzero.Я попробовал это, потому что это было сбой, может быть, я не использовал его правильно, поэтому, пожалуйста, скажите мне правильный путь.

Ответы [ 4 ]

6 голосов
/ 03 января 2012

Использование calloc наиболее соответствует приведенному выше примеру.

4 голосов
/ 03 января 2012

Во-первых, C массивы начинаются с нуля, а не с одного.Затем вы выделяете достаточно места для одного указателя, но в нем хранится 100 указателей.Вы пытаетесь выделить 100 A с, или вы пытаетесь выделить 100 наборов по 100 A с каждый?Наконец, malloc внутри вашего цикла выделяет пространство для sizeof a, а не sizeof (struct A).

Я предполагаю, что вы пытаетесь выделить массив из 100 указателей для A, каждый указательуказывая на один A.

Решения: Вы можете использовать calloc:

struct A **a;
/* In C, never cast malloc(). In C++, always cast malloc() */
a = malloc(100 * sizeof( (*a)));
for(i=0; i < 100; i++)
    a[i] = calloc(1, sizeof(struct A));

Или вы можете использовать memset:

struct A **a;
a = malloc(100 * sizeof(*a));
for(i = 0; i < 100; i++) {
  a[i] = malloc(sizeof(struct A));
  memset(a[i], 0, sizeof(struct A));
}

Вы спрашиваете "почему нужно инициализировать с нуля?"Это не так.Соответствующее требование таково: вы должны присвоить значение своим переменным или инициализировать вашу переменную, прежде чем использовать их в первый раз.Это назначение или инициализация может быть нулем, или это может быть 47, или это может быть "John Smith, Esq".Это просто должно быть какое-то действительное назначение.

Для удобства вы можете выбрать инициализацию всех ваших членов struct A в ноль, что вы можете сделать за один разоперация (memset или calloc).Если ноль не является полезным начальным значением для вас, вы можете инициализировать элементы структуры вручную, например:

struct A **a;
a = malloc(100 * sizeof(*a));
for(i = 0; i < 100; i++) {
  a[i] = malloc(sizeof(struct A));
  a[i]->index = i;
  a[i]->small_prime = 7;
  strcpy(a[i]->name, name_database[i]);
}

Если вы никогда не ссылаетесь на значение неинициализированной и неназначенной переменной, выхорошо.

0 голосов
/ 04 января 2012

Вам не нужно много malloc, достаточно одного calloc:

  int i;
  struct A **a = calloc(100,sizeof**a+sizeof*a),*mem=a+100;
  for(i=0;i<100;++i)
  {
    a[i]=&mem[i];
  }
  ...
  free(a);  /* and you only need ONE free */
0 голосов
/ 03 января 2012

Вы можете использовать memset() для установки всего массива на 0

OTOH,

a = (struct **)malloc(sizeof( (a*)));
for(i=1; i < 100; i++)
     a[i] = (struct*)malloc(sizeof(a) * 100);

неверно, потому что вы только что создали один элемент a *, но на следующей строке, когда цикл переходит ко 2-й итерации, он получит доступ к недопустимой памяти. Таким образом, чтобы выделить 100 элементов a *, ваш первый malloc() должен выглядеть следующим образом

a = (struct **)malloc(sizeof(a *) * 100);

Правильный код (включая обработку ошибок) будет более или менее выглядеть следующим образом:

if ((a = (struct **)malloc(sizeof(a*) * 100)) == NULL) {
    printf("unable to allocate memory \n");
    return -1;
}

for(i=0; i<100; i++) {
    if ((a[i] = (struct*)malloc(sizeof(a) * 100)) == NULL) {
        printf("unable to allocate memory \n");
        return -1;
    }
    memset(a[i], 0, 100);
}

или в качестве альтернативы malloc() и memset(), вы можете использовать calloc()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...