关于C语言中字符指针的困惑

苏梅特

C中的字符指针使我感到困惑。

假设我们有一个char指针,它指向字符串constant的第一个字符

char *a="ABCD";

然后,我们将无法使用指针a更改该字符的值,因为以下语句会导致分段错误。

*a='X';

现在假设我们有一个char指针,它指向一个字符常量

const char B='X';    
char *ptr=&B;

然后我们可以使用以下语句更改该字符的值

*ptr='Z';

我的问题是,这是否是一种不确定行为,证明C不够健全?还是涉及更深层次的逻辑?

谢尔盖·卡里尼琴科(Sergey Kalinichenko)

指针的行为有所不同的原因是C程序具有多个内存段,其中一些是受保护的。

然后,我们将无法使用指针a更改该字符的值,因为以下语句会导致分段错误。

与其他常量不同,字符串常量放置在受保护的段中。任何试图修改该段的尝试都会导致未定义的行为(即,您的程序可能存在段错误)。

由于您的指针指向一个字符串常量,因此它所指向的值无法修改。如果通过使用数组将常量的副本强制放入可修改的内存中,则将允许相同的修改:

char a[]="ABCD";
*a='X';

然后我们可以使用以下语句更改该[单个]字符的值

这是因为字符常量总是复制到可修改的内存中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章