2016-02-28 194 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()将新字符串复制到阵列时是完全合法的。