2015-05-01 3 views
1
struct list_el { 
    unsigned int data; 
    char name[16]; 
    char grade; 
    struct list_el * next; 
}; 

typedef struct list_el item; 

int main(int argc, char **argv) { 
    item *curr, *head; 

    //first item 
    curr->data = 3141592; 
    strcpy(curr->name, "Carl"); 
    curr->grade = 'A'; 
    curr->next = head; 
    head = curr; 

Попытка выяснить, почему это не работает, когда я пытаюсь установить имя «Карл». Я получаю «слишком мало аргументов для функции« strcpy », хотя у меня есть 2 аргумента (destination, source). Когда я добавляю третий аргумент (сколько символов нужно копировать?), Я получаю «назначение выражению с типом массива».Попытка установить строку в структуре

+2

Опубликуйте [MCVE] (http://stackoverflow.com/help/mcve), и вы не выделили память для 'curr' перед ее использованием. –

+0

Не знаете, почему это не удалось скомпилировать, но это определенно UB - вы объявляете указатель на «элемент», но не инициализировали его фактическим экземпляром. – MooseBoys

+0

Прошу прощения, это мешает затмению построить мой проект для меня ... – CodingNinjaInTraining

ответ

1

Я не получаю ваши ошибки «слишком мало аргументов для функции„STRCPY“», но я могу видеть, что у вас есть объявить пункт * ТОК но никогда initialized.So я попытался с исправлением этого и обновил ваш код, как показано ниже, и не дал никаких ошибок.

#include<stdio.h> 
#include<string.h> 
#include<stdlib.h> 
struct list_el { 
    unsigned int data; 
    char name[16]; 
    char grade; 
    struct list_el * next; 
}; 

typedef struct list_el item; 

int main(int argc, char **argv) { 
    item *curr, *head; 
    curr = malloc(sizeof(struct list_el)); 
    //first item 
    curr->data = 3141592; 
    strcpy(curr->name, "Carl"); 
    curr->grade = 'A'; 
    curr->next = head; 
    head = curr; 
} 

Я думаю, это сработает для вас.

+0

Идея: вместо 'curr = malloc (sizeof (struct list_el));', рассмотрите 'curr = malloc (sizeof * curr);' Легче кодировать, менее вероятно, ошибаться и легко поддерживать. – chux

+0

спасибо за эту идею :) –

1

Прежде чем использовать его, вы не выделили память для curr. Два варианта:

  1. Сделать curr точку к экземпляру item:

    item i; 
    curr = &i; 
    
  2. выделить память динамически для curr с помощью malloc/calloc:

    curr = malloc(sizeof(*curr)); 
    /*OR*/ 
    curr = calloc(1, sizeof(*curr)); 
    

    , а затем, освободить его после того, как его использование. Также неплохо проверить, не удалось ли malloc/calloc проверить его возвращаемое значение. Он вернет NULL при сбое.

Смежные вопросы