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

che*_*oot 0 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;
}
Run Code Online (Sandbox Code Playgroud)

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

Sha*_*our 7

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

*p = 'a';
Run Code Online (Sandbox Code Playgroud)

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

char str[] = "Hello";
Run Code Online (Sandbox Code Playgroud)

现在完全可以修改str.从draft C99 standard下部分6.4.5 String literals6:

如果这些数组的元素具有适当的值,则这些数组是否不同是未指定的.如果程序试图修改此类数组,则行为未定义.


Mah*_*esh 5

*p = 'a';
Run Code Online (Sandbox Code Playgroud)

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

char str[] = "Hello";
Run Code Online (Sandbox Code Playgroud)

上面的语句复制Hellostr字符数组,可以修改数组内容.