char * str vs char str []:分段问题

时间:2013-08-13 16:59:39

标签: c string segmentation-fault

#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 [],它就能完成这项工作。它们不是基本相同的东西吗?

2 个答案:

答案 0 :(得分:7)

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

*p = 'a';

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

char str[] = "Hello";

现在可以修改str。来自draft C99 standard部分6.4.5 String literals6下:

  

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

答案 1 :(得分:5)

*p = 'a';

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

char str[] = "Hello";

上述语句将Hello复制到str字符数组,并且可以修改数组内容。