这是我的代码:
typedef struct{
char name[64];
} Cat;
Cat createCat(char name[64]) {
Cat newCat;
newCat.name = name;
return newCat;
}
它编译时出现以下错误消息:
从类型'char'分配类型'char [64]'时,不兼容的类型 *'
我在这里做错了什么?
答案 0 :(得分:7)
传递给函数时,数组衰减为指针。所以:
Cat createCat(char name[64]) {
与:
相同Cat createCat(char* name) {
和行:
newCat.name = name;
正在尝试将char*
分配给char[]
,因为错误说明了。由于Mystical已经评论过,您需要使用memcpy()
或strcpy()
(或strncpy()
)将name
复制到newCat.name
。如果您使用memcpy()
,则必须记住取消终止newCat.name
。
答案 1 :(得分:0)
让人惊讶。您正在从函数返回自动(基于堆栈)变量。当弹出堆栈帧并且内存消失时,这将会非常糟糕。您需要动态分配Cat
结构并将name
数据复制到其中。完成记忆后,别忘了打电话给free()
。
Cat *createCat(char name[64])
{
Cat *tmpCat;
tmpCat=malloc(sizeof(Cat));
strncpy(Cat.name,name,64); // <- or 63 to make sure name is NULL-terminated
return tmpCat;
}
答案 2 :(得分:0)
您的代码有两个错误。首先是你在堆栈上分配内存。每当你声明一个这样的变量时:
int hello = 5;
char test;
Cat newCat;
您正在堆栈上分配内存。函数返回后立即释放该内存。要使某些东西更加永久,您需要使用malloc函数在堆中手动分配内存。此内存将保持有效,直到您稍后通过调用free()
将其释放。此外,您需要使用strncpy()
来复制字符串,您不能简单地复制指针。
Cat* createCat(char* name)
{
Cat* newCat = malloc(sizeof(Cat));
if(!newCat)
{
printf("Error allocating memory for cat\n");
exit(-1);
}
//copy in the string, leave a null terminator on the string
strncpy(newCat.name, name, 63);
newCat.name[63] = '\0';
return newCat;
}