Выделение памяти для массива структур

У меня есть структура, подобная следующей:

typedef struct author
{
char letter;
char *name[200];
int counter;
} Aut, *i_aut;

Он состоит из char и массива «Strings» и int. Моя цель — выделить место в памяти для массива из 30 таких структур, поэтому я попробовал что-то вроде следующего:

i_aut lista_autores=calloc(30,sizeof(Aut));

Однако он всегда возвращает «ошибку сегментации». Я тоже пытался инициализировать по одному, но с тем же результатом. Мой вопрос в том, как мне выделить память такого рода и как я могу получить к ней доступ позже?

Заранее спасибо и извините за опечатку.


person PablodeAcero    schedule 16.03.2014    source источник
comment
С char *name[200]; вы можете иметь 200 различных строк в каждой структуре (как вы описали, массив строк). Но: вам также нужно будет зарезервировать струны. Если вам нужна только одна строка с макс. длина 200, удалите *.   -  person deviantfan    schedule 16.03.2014
comment
как вы получаете доступ к name ?   -  person brokenfoot    schedule 16.03.2014
comment
Когда возникает ошибка сегментации? Это происходит, когда вы делаете только i_aut lista_autores=calloc(30,sizeof(Aut)); free(lista_autores); и больше ничего между ними?   -  person Sergey Kalinichenko    schedule 16.03.2014
comment
У меня есть ощущение, что вместо этого вы хотите char name[200], поскольку у автора есть только одно имя (длиной не более 199)?   -  person Henno Brandsma    schedule 16.03.2014


Ответы (2)


член структуры name представляет собой массив из 200 указателей.
Возможно, вы захотите присвоить результат malloc элементам массива.

struct author *i_aut;
i_aut = malloc(sizeof *i_aut);
if (i_aut) {
    for (size_t k = 0; k < 200; k++) {
        i_aut->name[k] = malloc(30);
        if (!i_aut->name[k]) /* error */;
        /* DONT FORGET TO FREE EACH NAME LATER ON */
    }
    free(i_aut);
}
person pmg    schedule 16.03.2014

попробуйте использовать это

    struct author **i_aut;
    i_aut=(struct author **)malloc(30*sizeof(struct author*));
    for(i=0;i<30;i++)
        i_aut[i]=(struct *)malloc(sizeof(struct author)); 

после этого вам не нужно выделять место для name[] отдельно. у вас есть массив из 30 элементов типа struct author*, и вы можете получить доступ ко всем трем типам, используя i_aut[i]->letter; i_aut[i]->имя[j]; i_aut[i]->счетчик; здесь мне 30

person user3424944    schedule 16.03.2014