2015-10-10 1 views
-1

У меня щеколда время выяснить, как выделить память для каждой строки в массиве строк в узле, следующим образом:Невозможно определить таНос аргумент для массива строк в узле

typedef struct node { 
    char args[10][20]; 
    struct node *previous; 
    struct node *next; 
} Node; 

Node * createNode(void) { 
    Node *newNode; 
    newNode = malloc(sizeof(Node)); 
    int i; 
    for(i = 0; i < 10; i++) { 
     newNode->args[i] = (char *) malloc(sizeof(char)); 
    } 
    return newNode; 
} 

Это приводит следующее сообщение об ошибке:

error: incompatible types when assigning to type ‘char[20]’ from type ‘char *’ 
    newNode->args[i] = (char *) malloc(sizeof(char)); 

Точно так же, когда я попытался malloc(sizeof(char *)), я получил эту ошибку:

error: incompatible types when assigning to type ‘char[20]’ from type ‘char *’ 
    newNode->args[i] = (char *) malloc(sizeof(char *)); 

Я думал, что начал понимать указатели на C, но теперь я очень смущен. Любая помощь будет оценена.

+3

Вам не нужно выделять память на символ [10] [20]. Поскольку это означает, что у вас уже достаточно памяти, выделенной для 10 массивов символов размером 20 каждый. – jayant

+1

В любом случае 'malloc (sizeof (char))' будет выделять один байт памяти. –

+1

И не бросайте результат 'malloc' & friends в C! – Olaf

ответ

0

Поскольку вы уже выделили память для аргументов в

char args[10][20] 

он выдает ошибку при перераспределении памяти для него.

Вместо этого вы могли бы изменить, чтобы:

char **args 

А затем выделить память с помощью таНос:

newNode->args = (char**)malloc(sizeof(*char)*10) 
for(i = 0; i < 10; i++) { 
    newNode->args[i] = (char *) malloc(sizeof(char)*20); 
} 

Предполагая, что вам нужен размер 20 строки.

+0

Просьба показать, как, поскольку длина строки никогда не была в попытках кода OP. –

+0

И ... почему? Если вы действительно хотите строки фиксированного размера, выделение их отдельно - это просто утилизация ресурсов. –

+0

и т. Д., Ваша формулировка настолько неточна, что она пытается ошибиться. 'char args [10] [20]' в коде OP ничего не выделяет, он объявляет член и выделяется, когда выделяется содержащая структура. Перераспределение не запрещено, но вы не можете назначить «строку» 2d-массива (потому что это не указатель), и в общем случае вы не можете перераспределить * часть * динамически выделенного объекта. –

0

Попытка дать ответ здесь, там, наверное, одна вещь, чтобы уточнить первый:

массив не указатель.

Это довольно распространенное заблуждение, поскольку массив автоматически распадается на как указатель при использовании в качестве аргумента функции и неявно конвертируется в указатель. Тем не менее это НЕ то же самое.

Итак, учитывая это, посмотрите на свою структуру. У вас нет указателей на char. Просто не нужно ничего выделять для args, потому что ваш struct node уже включает в себя 10 * 20 байтов пространства для члена args.