0
#include <stdio.h>
#include <conio.h>

void test(char *p)
{
     p = p + 1;
     *p = 'a';
}

int main()
{
    char *str = "Hello";
    test(str);
    printf("%s", str);
    getch();
    return 0;
}

当我运行此代码时,它会给出分段错误?为什么会这样。const 理论对我来说并不清楚……而如果我将 str 声明为 char str[],它就可以完成工作。它们不是基本相同的东西吗?

4

2 回答 2

7

str指向一个字符串文字,您正在尝试test在此行的函数中修改字符串文字:

*p = 'a';

它是undefined behavior尝试修改字符串文字。您也可以将字符串文字复制到数组中,如下所示:

char str[] = "Hello";

现在修改完全没问题str。从draft C99 standard, 节6.4.5 String literals段下6

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

于 2013-08-13T17:01:17.207 回答
5
*p = 'a';

问题是上面的语句试图修改只读段。字符串文字"Hello"位于只读段中,不能修改。

char str[] = "Hello";

上述语句复制Hellostr字符数组,可以修改数组内容。

于 2013-08-13T17:02:16.523 回答