這是我的代碼:問題與結構和字符串
typedef struct{
char name[64];
} Cat;
Cat createCat(char name[64]) {
Cat newCat;
newCat.name = name;
return newCat;
}
它編譯與以下錯誤消息:分配給輸入從類型「的char [64]」時
不兼容的類型「字符' *'
我在這裏做錯了什麼?
這是我的代碼:問題與結構和字符串
typedef struct{
char name[64];
} Cat;
Cat createCat(char name[64]) {
Cat newCat;
newCat.name = name;
return newCat;
}
它編譯與以下錯誤消息:分配給輸入從類型「的char [64]」時
不兼容的類型「字符' *'
我在這裏做錯了什麼?
是的。你從一個函數返回一個自動(基於棧)的變量。當堆棧框架彈出並且內存消失時,這將會非常可怕地死亡。您需要動態分配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;
}
這是不正確的。已分配的本地堆棧「貓」的副本正在返回,因此發佈的代碼在這方面很好。 – hmjd 2012-08-06 15:31:30
Arrgh,你說得對。 – 2012-08-06 15:54:30
您的代碼有兩個錯誤。首先是你在堆棧上分配內存。無論何時您聲明如下變量:
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-06 15:40:45
嘗試'memcpy()'或'strcpy()'。 – Mysticial 2012-08-06 15:21:05
[字符數組初始化]的可能重複(http://stackoverflow.com/questions/7255984/character-array-initialization) – ecatmur 2012-08-06 15:24:43