2012-08-06 52 views
0

這是我的代碼:問題與結構和字符串

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

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

    newCat.name = name; 

    return newCat; 
} 

它編譯與以下錯誤消息:分配給輸入從類型「的char [64]」時

不兼容的類型「字符' *'

我在這裏做錯了什麼?

+2

嘗試'memcpy()'或'strcpy()'。 – Mysticial 2012-08-06 15:21:05

+0

[字符數組初始化]的可能重複(http://stackoverflow.com/questions/7255984/character-array-initialization) – ecatmur 2012-08-06 15:24:43

回答

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

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; 
} 
+3

這是不正確的。已分配的本地堆棧「貓」的副本正在返回,因此發佈的代碼在這方面很好。 – hmjd 2012-08-06 15:31:30

+0

Arrgh,你說得對。 – 2012-08-06 15:54:30

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; 
} 
+1

返回堆棧分配的結構很好,返回一個副本。只有指向堆棧分配數據的指針會遇到數據消失的問題。 – 2012-08-06 15:40:45