2016-02-28 156 views
1
struct college  
{ 
     char name[30];  
     char course[30];  
     int fee;  
    };  
    struct college c1={"purnia","m.com",5000};  
    struct college c2; 

int main() 
{ 
     struct college c2={"magadh","hazipur",5200}; //1 
    c2.name="magadh"; // 2  
    c2.course="fine arts"; // 3 
    c2.fee=3000; //4 
    strcpy(c2.name,"godda"); //5 

} 

的線2和3給出了誤差作爲不兼容的類型的分配,而圖1個5作品fine.This只發生與字符串類型members.Is它,因爲陣列不能被分配但隨後爲什麼線1效果很好。 在此先感謝。初始化錯誤

+1

數組可以在聲明期間用字符串初始化,但不能在之後。如果要重新分配,則必須訪問數組的相應索引並分配值。 –

+0

這就是爲什麼,第1行正在工作,但不是第2行和第3行。 –

回答

0

該字段是數組char。您必須將char s複製到陣列中。像你在第5行那樣嘗試類似strcpy()的東西。你不能像這樣分配一個「字符串」。

第1行工作,因爲它是一個初始化,而不是一個賦值。編譯器給它提供的值爲它在堆棧上分配空間時提供的值。

如果字段類型爲char *(例如您聲明char *name),則可以爲其指定字符串文字。但含義不同:它會使name指向字符串字面值"magadh"。你不能修改這個字符串的內容,因爲它是一個字符串文字。例如,下面的會導致不確定的行爲:

char *name = "magadh"; 
name[0] = 'n'; /* <-- undefined behaviour */ 

一個原因這個壞(不是C說,這是)是你不知道的編譯器會將"magadh"在內存中。允許將其放入不可寫的代碼文本部分。

通知使用以下的區別:

char name[30] = "magadh"; 
name[0] = 'n'; /* <-- this is OK */ 

name的駐留這裏堆棧作爲局部變量上。它是一個數組char,當數組被分配時,它被賦值(初始化)。您可以修改它,因爲您可以修改局部變量,因爲它們在堆棧中。

在C中,確實沒有「字符串」。它們只是連續的char某處(希望)終止於空終止符'\0'。如果你想「分配」一個(如你的第2和第3行),你必須明確地說從源到目的地複製char,從頭到尾。這是strcpy()庫函數的用途。

1

第1行的工作原理是因爲您沒有使用指向字符串的指針初始化成員,但是您正在使用該字符串內容初始化數組。
當您嘗試執行:

struct college c2={"magadh","hazipur",5200}; 

編譯器保留在內存中的空間結構和inits陣列namecourse分別與"magadh""hazipur"。但是,當你的代碼:

c2.name="magadh"; 

你想創建一個初始化字符串,"magadh",在內存中,然後它的地址分配給數組c2.name
使用strcpy()將新字符串複製到陣列時是完全合法的。