关于C中字符指针的困惑
C中的字符指针令我困惑。
假设我们有一个char指针,它指向string 常量的第一个字符。
char *a="ABCD";
然后我们不能使用指针a更改该字符的值,因为以下语句会导致分段错误。
*a='X';
现在假设我们有一个char指针,指向一个字符常量 。
const char B='X'; char *ptr=&B;
然后我们可以使用该语句更改该字符的值
*ptr='Z';
我的问题是,这是一个未定义的行为,certificateC不健壮? 或者是否涉及更深层次的逻辑?
指针行为不同的原因是C程序有几个内存段,其中一些是受保护的。
然后我们不能使用指针a更改该字符的值,因为以下语句会导致分段错误。
与其他常量不同,字符串常量被放入受保护的段中。 任何修改此段的尝试都会导致未定义的行为(即您的程序可能会出现段错误)。
由于指针指向一个字符串常量,因此无法修改它指向的值。 如果通过使用数组强制将常量的副本转换为可修改的内存,则允许进行相同的修改:
char a[]="ABCD"; *a='X';
然后我们可以使用该语句更改该[single]字符的值
这是因为字符常量总是被复制到可修改的内存中。
让我们说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
限定对象是违反约束。