以下声明和定义之间的区别

问题描述 投票:0回答:1

根据我的课本,

  1. char *p =“你好”;

    • 指向字符串的指针,其中字符串和指针都可以修改
  2. const char *p =“你好”;

    • 指向常量字符串的指针,其中该字符串无法操作,但可以操作该指针指向另一个字符字符串
  3. char *const p =“你好”;

  • 指向字符串的常量指针,可以操作字符串,但不能操作指针指向另一个字符字符串
  1. const char *const p =“你好”;
  • 字符串或指针都不能更改。

但是这是我在可以修改字符串的不同情况下的输出 -

#include <stdio.h>

int main() {
    // Write C code here
     char *p = "hello";
    *p = 'a';
    //p = "bye";
    printf("%s",p);

    return 0;
}

输出:分段错误

#include <stdio.h>

int main() {
    // Write C code here
    char *const p = "hello";
    *p = 'a';
    //p = "bye";
    printf("%s",p);

    return 0;
}

输出:分段错误

在这些情况下,当我遇到的几乎所有参考文献都说不是这样时,我什么时候会遇到分段错误?谢谢。

c pointers segmentation-fault
1个回答
0
投票

您不能更改字符串文字。任何更改字符串文字的尝试都会导致未定义的行为。

来自 C17 标准(6.4.5 字符串文字)

7 未指定这些数组是否不同,只要它们的 元素具有适当的值。 如果程序尝试 修改这样的数组,行为是未定义的。

© www.soinside.com 2019 - 2024. All rights reserved.