2013-07-03 5 views
2

Мне нужна помощь в решении этой проблемы. Вот код:C несовместимая ошибка указателя

#include <stdio.h> 
#include <stdlib.h> 
#include <errno.h> 
#include <string.h> 

struct Person{ 
    char *name[100]; 
    char *nationality[100]; 
}; 

void put_values(struct Person *p, const char *name){ 
    strncpy(p->name, name, 500); 
} 

int main(int argc, char *argv[]){ 
    struct Person *person = malloc(sizeof(struct Person)); 
    put_values(person, argv[1]); 
    free(person); 
    return 0; 
} 

А вот сообщение об ошибке:

ex17t.c: In function ‘put_values’: 
ex17t.c:19:3: warning: passing argument 1 of ‘strncpy’ from incompatible pointer type [enabled by default] 
In file included from ex17t.c:4:0: 
/usr/include/string.h:131:14: note: expected ‘char * __restrict__’ but argument is of type ‘char **’ 

Любая помощь или советы будут оценены. Благодаря!

+3

'char * name [100]' подходит для человека с более чем 90 именами. Вы имеете в виду 'char name [100]'. Если вы идете на 200 национальностей, у вас могут быть настоящие «граждане мира»; по моему мнению, всего около 180 национальностей. –

+0

Почему третий аргумент 'strncpy'' 500'? Откуда взялось «500»? – AnT

ответ

2

В вашем коде имя означает массив из 100 указателей символов. Но для strncpy первый аргумент является указателем char. так что вы должны сделать так:

struct Person{ 
    char name[100]; 
    char nationality[100]; 
}; 
3

Ваша структура должна быть (без * символов):

struct Person { 
    char name[100]; 
    char nationality[100]; 
}; 

, как вы имели его, name на самом деле массив 100 символа указателей, а не 100 символов. Если ваше имя не Juan Romirez Sancho Ricardo Agusti Donatello Alfonso ... Ramundo Ronaldo Bus Stop F’tang-F’tang Ole Biscuit Barrell, и вы хотите, чтобы иметь возможность обрабатывать каждое имя независимо, это, вероятно, не то, что вам нужно.

Это также, вероятно, не разумно ограничить strncpy до 500 символов, когда поле вы пытаетесь скопировать, чтобы есть только 100 :-)

2

Ошибка заключается в объявлении Person:

struct Person{ 
    char name[100]; 
    char nationality[100]; 
}; 

Ваше заявление предлагает человеку со 100 возможными именами и 100 возможными национальностями, которые должны быть динамически распределены. Это не намеренное использование Person: кажется, что вам нужно одно имя/национальность, с 99 символами + нулевой ограничитель.

0

Определяя

struct Person{ 
    char *name[100]; 
    char *nationality[100]; 
}; 

У вас есть указатель на массив символов. Поскольку массив символов эквивалентен указателю на кучу символов, char *name[100] является эквивалентом указателя на кучу указателей на кучу символов. Это может быть полезно, если вы намереваетесь иметь несколько групп из 100 массивов символов, но ясно, что это не ваше намерение.

strncpy(p->name, name, 500); 

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

struct Person{ 
    char name[100]; 
    char nationality[100]; 
}; 

strncpy(p->name, name, 500); 

, которая копирует строку в кучу символов.

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