繁体   English   中英

关于C中字符指针的困惑

[英]Confusion about Character Pointers in C

C中的字符指针令我困惑。

假设我们有一个char指针,它指向string 常量的第一个字符。

char *a="ABCD";

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

*a='X';

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

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

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

*ptr='Z';

我的问题是,这是一个未定义的行为,证明C不健壮? 或者是否涉及更深层次的逻辑?

让我们说C让你很容易在脚下射击。 修改B仍然是未定义的行为,就像修改*a ,因为B已被声明为const

为了解决这个问题,打开警告(除非在非常特殊的情况下,你应该总是这样做)在GCC上发出以下信息:

warning: initialization discards 'const' qualifier from pointer
         target type [-Wdiscarded-qualifiers]

在C中,不允许修改字符串文字。

char *a="ABCD";  

相当于

char const *a="ABCD";  

*a='X'; 正在修改字符串文字ABCD 而在第二种情况下, ptr指向一个不应该改变的字符, *ptr='Z'; 将修改包含X的位置的内容,该位置也无效。

请注意,修改const限定对象是违反约束。

指针表现不同的原因是C程序有几个内存段,其中一些是受保护的。

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM