2017-02-18 20 views
-1

Я хочу динамический массив строк, поэтому указатели на указатели массива. Это мой код (моя программа падает после печати):Mallocing двухмерный массив, сбой после попытки печати строк

typedef struct person{ 
    char *name; 
    char **children; 
    struct person *nextPerson; 

}Person; 

int main(){ 
    int kidsNum = 1; 
    int i; 
    Person *first = (Person*)malloc(sizeof(Person)); 
    first->name = "George"; 
    first->children = malloc(kidsNum * sizeof(char*)); 
    for (i = 0; i < kidsNum; i++){ 
     //every string consists maximum of 80 characters 
     (first->children)[i] = malloc((80+1) * sizeof(char)); 
     scanf("%s",((first->children)[i])); 
     printf("%s",(*((first->children))[i])); 
    } 
} 

Он выходит из строя после Printf, я не знаю, если он выходит из строя из-за плохой mallocing, или я не знаю, как печатать строки правильно в сценарии.

+2

аргументов зсапЕ & Printf должен быть одинаковым для печати полукокса массивов/ –

+0

'Е ("% S", (* ((первого> детей)) [i])); '->' printf ("% s \ n", first-> children [i]); ' – BLUEPIXY

+0

скомпилировать с включенными предупреждениями –

ответ

1

Когда вы разыскиваете указатель (это то, что ((first->children)[i])), вы получаете значение памяти, в которой указывает указатель.

В вашем случае (*((first->children))[i]) является одиночным символом (т.е. char), а не строка. Попытка напечатать его в виде строки приведет к неопределенным поведением и вероятному сбою.

Не разыменование указателя:

printf("%s",first->children[i]); 
+0

О, ну глупо меня, спасибо! – user3575645