C中的字符指针使我感到困惑。
假设我们有一个char指针,它指向字符串constant的第一个字符。
char *a="ABCD";
然后,我们将无法使用指针a更改该字符的值,因为以下语句会导致分段错误。
*a='X';
现在假设我们有一个char指针,它指向一个字符常量。
const char B='X';
char *ptr=&B;
然后我们可以使用以下语句更改该字符的值
*ptr='Z';
我的问题是,这是否是一种不确定行为,证明C不够健全?还是涉及更深层次的逻辑?
指针的行为有所不同的原因是C程序具有多个内存段,其中一些是受保护的。
然后,我们将无法使用指针a更改该字符的值,因为以下语句会导致分段错误。
与其他常量不同,字符串常量放置在受保护的段中。任何试图修改该段的尝试都会导致未定义的行为(即,您的程序可能存在段错误)。
由于您的指针指向一个字符串常量,因此它所指向的值无法修改。如果通过使用数组将常量的副本强制放入可修改的内存中,则将允许相同的修改:
char a[]="ABCD";
*a='X';
然后我们可以使用以下语句更改该[单个]字符的值
这是因为字符常量总是复制到可修改的内存中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句