c/c++开发分享关于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限定对象是违反约束。

      以上就是c/c++开发分享关于C中字符指针的困惑相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注(猴子技术宅)。

      本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

      如若转载,请注明出处:https://www.ssfiction.com/c-cyuyankaifa/545900.html

      发表评论

      电子邮件地址不会被公开。 必填项已用*标注