结构和字符串问题

时间:2012-08-06 15:19:52

标签: c

这是我的代码:

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

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

  newCat.name = name;

  return newCat;
}

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

  从类型'char'分配类型'char [64]'时,

不兼容的类型   *'

我在这里做错了什么?

3 个答案:

答案 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;
}