2016-11-02 2 views
0

Если я объявляю простую структуру, как показано ниже:Ссылаясь на типы Struct в объявлении функции?

typedef struct {  
    char name[50];  
    int age;  
} Person;  

struct Person people[7]; 

А потом обратиться к нему ниже для вставки данных:

static void insert(Person people[HOW_MANY], char *name, int age)  
{  
    static int nextfreeplace = 0;  

    people[nextfreeplace].name = &name;  
    people[nextfreeplace].age = age;  

    nextfreeplace += 1;  
}  

Я получить несовместимую ошибку типа:

error: incompatible types when assigning to type 'char[50]' from type 'char **' people[nextfreeplace].name = &name; 

Я объявлял свою структуру неправильной? Или я перепутал свои указатели?

+0

Посмотрите на [strncpy] (https://linux.die.net/man/3/strncpy) – LPs

+0

@LPs Вероятно, вы имеете в виду 'strcpy'. 'strncpy' следует избегать, см. [this] (http://stackoverflow.com/questions/2114896/why-are-strlcpy-and-strlcat-consideredinsecure) и [это] (https: //randomascii.wordpress .com/2013/04/03/stop-using-strncpy-already /) и т. д. и т. д. – Lundin

ответ

1

Просто используйте

snprintf(people[nextfreeplace].name, 50, "%s", name); 

скопировать строку. В этом случае он также проверяет размер буфера.

+0

Это работало по назначению, но теперь я получаю «тип массива имеет неполный тип элемента» при объявлении структуры (например, struct Person people [ СКОЛЬКО];). Это удивительно, поскольку я положил это после объявления структуры, где я наткнулся? – Masutatsu

+0

Вы используете typedef для определения нового типа Person. Тогда вы должны использовать его точно (например, Person people [HOW_MANY];) – uran235

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