C不兼容指针错误

时间:2013-07-03 03:00:39

标签: c pointers

我需要帮助解决这个问题。这是代码:

#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 **’

任何帮助或提示将不胜感激。谢谢!

4 个答案:

答案 0 :(得分:4)

您的结构应该是(没有*个字符):

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,并且你希望能够独立处理每个名字,否则这可能不是你想要的。

当您尝试复制的字段只有100时,将strncpy限制为500个字符也可能不明智: - )

答案 1 :(得分:3)

错误出现在Person

的声明中
struct Person{
    char name[100];
    char nationality[100];
};

您的声明建议一个人有100个可能的名字和100个可能的国籍,必须动态分配。这不是Person的预期用途:您似乎想要一个名称/国籍,每个都有99个字符+空终止符。

答案 2 :(得分:3)

在您的代码中,name表示包含100个char指针的数组。 但是对于strncpy,第一个参数是char的指针。 所以你应该这样做:

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

答案 3 :(得分:1)

通过定义

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

你有一个指向chars数组的指针。由于字符数组相当于指向一堆字符的指针,char *name[100]相当于指向一堆字符指针的指针。如果您打算拥有多个包含100个char数组的组,那么这可能很有用,但很明显这不是您的意图。

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

根据上面的定义,会尝试将字符串复制到指向一堆字符的指针,而不是所需的

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

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

将字符串复制到一堆字符中。