Во-первых, 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]);
}
Если вы никогда не ссылаетесь на значение неинициализированной и неназначенной переменной, выхорошо.