[问题] 字串赋值问题

楼主: kdok123 (小天)   2014-10-19 23:33:09
ex1:
char str[6] = "hello";
*str = 'x';
// 编译通过
ex2:
char *str = "hello";
*str = 'x';
//编译失败
想请问是为什么呢?
作者: LPH66 (-6.2598534e+18f)   2014-10-19 23:41:00
置底十三诫之四
作者: jammy50605 (小刀)   2014-10-20 00:06:00
ex1的str是阵列第一个元素的位址 会变成xelloex2的str是字符指标 字符指标重新指定字串要 str='x'字串会整个被改成x 而且应该要用双引号代表字串"x"
作者: loveflames (咕啾咕啾魔法阵)   2014-10-20 00:31:00
第二个指向唯读区,就算能编译也不能执行
作者: uranusjr (←這人是超級笨蛋)   2014-10-20 00:53:00
不过原来这样会 error 啊, 我一直以为会通过然后 crash
作者: johnpage (johnpage)   2014-10-20 00:58:00
死背
作者: LPH66 (-6.2598534e+18f)   2014-10-20 22:04:00
连这都要死背的话还是别写程式吧 (望) 另外四楼后半不对它想做的跟 ex1 是一样的, 两者差别就只是五楼说的这样而已
作者: jammy50605 (小刀)   2014-10-21 00:37:00
如果要跟ex1一样只改字串中的单一字符是办不到的因为你的str是字符指标会指到一个字串他并没有像字符阵列有偏移的概念 所以不能拿str改字符所以*str跟*str[0]是一样意思 都是不行的~
作者: LPH66 (-6.2598534e+18f)   2014-10-21 00:58:00
唔嗯, C 语言的字串就只是个尾巴有个 '\0' 的字符阵列而已所以 ex2 之所以做不到的原因完全是因为唯读
作者: jammy50605 (小刀)   2014-10-21 01:41:00
喔喔 LPH66大大说的才是对的 系统会找个位址放字串常数 然后把位址回传给str 但这个位址系统不给用(唯独)
作者: loveflames (咕啾咕啾魔法阵)   2014-10-21 01:44:00
字符指标一样有偏移的概念,a[b]等同*(a+b)等同b[a]
作者: jammy50605 (小刀)   2014-10-21 01:44:00
只能重新让系统找新的位址放字串常数 回传字串常数的位址这样 受教了~~
作者: loveflames (咕啾咕啾魔法阵)   2014-10-21 01:46:00
所以*str等同str[0]跟0[str]第二个是因为str指向唯读区,*str相当于修改唯读区
楼主: kdok123 (小天)   2014-10-22 10:58:00
原来如此! 感谢各位解答!

Links booklink

Contact Us: admin [ a t ] ucptt.com