【问题标题】:Why the following will produce segmentation fault?为什么下面会产生segmentation fault?
【发布时间】:2010-11-20 03:13:10
【问题描述】:
int main()
{
        char *temp = "Paras";

        int i;
        i=0;

        temp[3]='F';

        for (i =0 ; i < 5 ; i++ )
                printf("%c\n", temp[i]);

        return 0;
}

既然temp不是const,为什么temp[3]='F';会导致分段错误?

【问题讨论】:

  • 因为你的 C/OS 实现是慷慨的,当你调用未定义的行为时会立即终止程序,而不是在你的鼻子上召唤恶魔力量。

标签: c constants segmentation-fault


【解决方案1】:

你不能修改字符串字面量。

【讨论】:

  • 是的。我认为编译器应该警告你这一点,但例如 gcc 不会。无论哪种方式,该标准都允许编译器将字符串常量放入只读内存中。
  • @cse char *temp = "Paras" 表示 temp 指向一个字符串文字。尝试修改字符串文字是未定义的。 securecoding.cert.org/confluence/display/seccode/… char temp[6] = "Paras"; 做了一些完全不同的事情 - 它创建一个数组(不是指针,也不是常量)并将字符串文字复制到该数组中。
【解决方案2】:

*temp 被定义为指向常量的指针(有时称为字符串字面量——尤其是在其他语言中)。

因此出现错误的行是试图改变这个常量的第三个字符。

尝试定义一个 char 数组并使用 strcpy 将 temp 复制到其中。然后在数组上执行上面的代码,它应该可以工作。 (抱歉我这里的ipad不喜欢向SO的界面插入代码)

【讨论】:

  • 我知道这种感觉。我认为 SO 开发人员应该在可预见的未来考虑 iPad 用户。
【解决方案3】:

如您所见,temp 是一个指针,它指向一个随机地址,其中包含值为Paras 的无名数组所在的位置。而那个数组是一个字符串常量。

为了让您的程序正常工作,您需要使用数组而不是指针:

char temp[6] = "Paras";

现在如果你想知道为什么是temp[6]而不是temp[5],上面的代码初始化一个字符串,和完全不同:

char temp[5] = {'P', 'a', 'r', 'a', 's'};

字符串以空终止符\0 终止。字符串初始化如下:

char temp[6] = {'P', 'a', 'r', 'a', 's', '\0'};

【讨论】:

  • 更好的是,char temp[] = ,所以编译器会计算出长度。
【解决方案4】:
  temp[3]='F'; 

这行不正确。“temp”是const值,所以不能修改。

【讨论】:

    猜你喜欢
    • 2021-08-06
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-09
    • 1970-01-01
    相关资源
    最近更新 更多