2012-06-06 26 views
2

當試圖初始化以下結構中的名稱時,出現錯誤消息「錯誤:從類型'char *'」分配類型'char [10]'時的不兼容類型:C編程中的結構(初始化語句)

#include <stdio.h> 

struct info 
{ 
    char name[10]; 
    int years; 
}; 

int main(void){ 
    struct info b; 

    b.name = "Michael"; 
    b.years = 19; 
    return 0 
;} 
+3

這不是簡單的c –

+0

數組與指針不同,請查看Jay的回答中的鏈接 – xvatar

回答

2

使用這個代替:

strcpy(b.name,"Michael"); 
+0

有沒有辦法在不使用字符串庫的情況下做到這一點?我不明白爲什麼這不起作用。 –

+0

@ Michael_19:你稱之爲「字符串庫」,實際上是C標準庫的一部分。你應該可以使用它,除非你有充分的理由不將你的程序與C標準庫鏈接。 – jweyrich

+1

@ Michael_19:如果你願意,你可以使用循環代替:'struct info in; \t char name [] =「Michael」; \t int i = 0; \t while(i <9) \t { \t \t in.name [i] = name [i]; \t \t i ++; \t} \t in.name [i] ='\ 0';' – Jack

0

如果你做char name[10]你staticaly分配,其基址可以通過name變量來訪問內存。您不能將地址指針變爲靜態分配的數組。即不能爲name變量添加不同的地址。

在你做b.name =「Micheal」,你就是這麼做的。您正試圖將「Micheal」字符串的基址添加到name變量中。

因此,要像@Vaughn所說的那樣,將「Micheal」複製到b.name指向的內存中。或在結構中將char name[10]更改爲char *name

4

既然你只是想初始化結構,你很可能逃脫:

struct info b = {"Michael", 19}; 

Ç使得初始化和賦值(即使它們使用相同的運營商)之間的區別。數組不能分配,(必須使用memcpy或類似的方法),但是數據可以由初始化程序指定的某個值生成。

0

問題是,名稱的地址必須位於包含它的信息對象的內存中,而字符串文字位於內存的某個不同區域。編譯器確保它們的位置在您的程序中提及的位置是合理的,並且它們不能被任意移動或合併。或者:

  • name應改爲const char*,並在文字(在這裏,作爲const char*字符串文字不得修改),或
  • 從字面strcpy() -ied到name內容指出(但你需要注意確保name總是足夠大的文本和終止ASCII NUL/0字符),或
  • name更改爲char*並分配給strdup()文字的堆分配副本(它確保你可以修改name船尾而且由name控制的內存將足夠大以存儲文字的副​​本,但在完成時需要free(name))。
1

讓我們來看看main()運行時會發生什麼。

struct info b; 

通過這個,你初始化struct,包括它的name

name是一個字符數組(正如Jay指出的,它不同於指針),現在它被分配了一塊內存和一些隨機的東西在裏面。

下一頁

b.name = "Michael"; 

通過這個嘗試將字符串字面量分配給您的字符數組。

通常情況下,你在聲明中指定字符串文本字符數組這樣char a[] = "hello";

將字符串文字複製到一塊內存,讓a「坐在一旁的記憶」。然而,在你的情況下,b.name已經坐在另一塊內存上,你不能通過只做一個任務來改變坐姿,因爲數組不是指針

所以,如果你想修改b.name,你要麼使用strcpy作爲沃恩卡託說,要不你通過系統字符做到這一點的性格,像

b.name[0] = 'M'; 
b.name[1] = 'i'; 
... 

基本上是同樣的事情「的strcpy」