0

这是我的代码:

typedef struct{
  char name[64];
} Cat;

Cat createCat(char name[64]) {
  Cat newCat;

  newCat.name = name;

  return newCat;
}

它编译时出现以下错误消息:

从类型'char *'分配给类型'char [64]'时不兼容的类型

我在这里做错了什么?

4

3 回答 3

7

数组在传递给函数时衰减为指针。所以:

Cat createCat(char name[64]) {

是相同的:

Cat createCat(char* name) {

和行:

newCat.name = name;

正试图将 a 分配char*给 a char[],因为错误状态。正如Mystical已经评论的那样,您需要使用memcpy()or strcpy()(or strncpy()) 复制namenewCat.name. 如果你使用memcpy()必须记住 null terminate newCat.name

于 2012-08-06T15:23:46.863 回答
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;
}
于 2012-08-06T15:26:46.530 回答
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;
}
于 2012-08-06T15:38:14.883 回答