[问题] 阵列与字串的疑问

楼主: auto402749 (桓桓)   2016-04-12 22:54:43
大家好,我是刚学c语言指标的新手
在书上关于阵列和字串的关系有点疑问
如果 char str[ ]="Hello";
那下一行打 str="Goodbye";
为什么会出现编译错误?
用成指标
char *str="Hello";
下一行打 str="Goodbye";
却能够编译
想请问各位,为什么阵列不能再指定一个新的字串到str里
谢谢!!
作者: stupid0319 (征女友)   2016-04-12 22:57:00
要有内存空间的概念才能弄懂指标跟字串吧str[]中的str像是指标,但他只能指向固定阵列char *str的str是指标,你要指向谁都没人理你
作者: wtchen (没有存在感的人)   2016-04-12 23:05:00
char *str="Hello"; str="Goodbye";编译会过但不见得OK请看置底的13诫第4点
作者: stupid0319 (征女友)   2016-04-12 23:06:00
他没改字串常数啦,只是指向另一个字串不过这样写怪怪的就是了
作者: wtchen (没有存在感的人)   2016-04-12 23:12:00
str的空间没配治好不会segmentation fault?
作者: LiloHuang (十年一刻)   2016-04-12 23:15:00
string literal 本来已经放在 data segment 了str[0] = 'x'; 这个才是置底的13诫第4点要讲的string literal 不是放在 stack 也不是放在 heapdata segment 配置跟初始化是 program loader 要做的事
作者: wtchen (没有存在感的人)   2016-04-12 23:29:00
可是13诫第4点Page2有提到配置空间要足够不然你把他变成长一点的字串就有可能出问题
作者: LiloHuang (十年一刻)   2016-04-12 23:59:00
我讲的是两件事情...字串常数跟字符阵列是两件事情13-4-2 提到的配置空间足够,指的是如果要把字串相接到一个字符阵列,其阵列大小要足够。而字符常数,空间不需要自己去配置,也不可以去修改它而原po重新把字符指标指到另一个字符常数,这写法无误语法上字符常数无法塞给字符阵列,因此编译期就会错误
作者: ko27tye (好滋好滋)   2016-04-13 00:11:00
因为你不能用阵列去初始化另一个阵列
作者: Frozenmouse (*冰之鼠*)   2016-04-13 09:36:00
应该不是初始化而是给值,像下面这样也是不行的:https://ideone.com/zFaC6o总之就是语法上的限制 ._.
作者: weiclin (CC)   2016-04-13 10:19:00
char str[] = "Hello" 等于 char str[6] = "Hello"他是阵列, 只是编译器帮你计算了长度你可以自由修改阵列内的值,不会有问题char *str="Hello" 是一个指标指向系统某个唯读的字串你可以把他指到另一个字串,但不能改他: str[0]='N'
作者: LiloHuang (十年一刻)   2016-04-13 12:48:00
通常指向 string literal 都会加上 const 来避免犯错有兴趣阅读更多细节的,请自己看 http://goo.gl/5GFnAn
作者: TobyH4cker (Toby (我要当好人))   2016-04-14 09:16:00
怎么只有我觉得原PO只是想把新的字串放进原阵列......
作者: Frozenmouse (*冰之鼠*)   2016-04-14 11:46:00
他是要这样没错啊…只是他用的语法上不可行
作者: tony21177   2016-04-17 10:18:00
依照K&R 2 array name str不是变量,不能做assignment

Links booklink

Contact Us: admin [ a t ] ucptt.com