C语言,为什么char str[]="I love China"可以赋值,但是char str[20];再赋值就不合法了呢?

如题;
比如 char str[]="I love China!";
是合法的,效果相当于char *str = "I love China!";
但是
char str[20];
str = "I love China!" 就不合法了。

但是char *str;
str = "I love China"就合法。

这之间是个什么道理?

首先说char *str;
str="I love China";
这两句话的本质是,在内存中开辟一段内存空间,把"I love China"放进这段内存空间,然后把这段内存空间的地址交给str,由于str是变量,所以给它赋值是合法的。

再来看char str[]="I love China";这句话的作用是定义一个char数组,str是数组名,也是首元素地址,由于这里是变量的定义,所以对于编译器来说,开辟内存空间然后放进字符串,再把地址交给str依然是可以接受的。

最后看char str[20];
str = "I love China!";这句话里面,先定义了一个char数组str,str就指向那一片大小为20的内存空间,然后再开辟一段内存空间放进字符串,这时候问题就来了,str本身是一个固定的不能改变的值,你强行把新的地址赋值给它,当然就是不合理的。
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2018-04-10
char str[20];
str = "I love China!" 就不合法了。
因为一维数组的名字str是一个指针常量,常量不允许被赋值,
=左边要求必须是变量或者数组元素。

第一种情况是初始化时是可以的!初始化与单独赋值有区别。本回答被提问者和网友采纳