不兼容指针错误(C语言)

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

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

非常感谢您能提供任何关于IT技术方面的帮助和建议。感谢您!


3
如果一个人有90个名字,那么char *name[100]是适当的。但实际上应该使用char name[100]。如果你要处理200个国籍,那么你可以成为真正的"世界公民"。不过据我所知,全球只有大约180个国家。 - Jonathan Leffler
strncpy函数的第三个参数为什么是500500是从哪里来的? - AnT stands with Russia
4个回答

5
你的结构应该是(不包括*字符):
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个字符可能也不明智 :-)。


3
错误在于 Person 的声明中:
struct Person{
    char name[100];
    char nationality[100];
};

您的声明表明有一个可能拥有100个名称和100个国籍的人,这需要动态分配内存。这并不是“Person”的预期用法:看起来您想要一个单一的姓名/国籍,每个都有99个字符加上空终止符。

3
在你的代码中,name表示一个100个char指针的数组。 但对于strncpy函数,第一个参数是一个char指针的指针。 所以你应该这样做:
struct Person{
    char name[100];
    char nationality[100];
};

1
通过定义。
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);

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接