0
int main()
{
        char *s="Hello";
        *s="World";
        printf("%s\n",s);
}

Why does the above program result in a segmentation fault?

4

7 回答 7

4
int main()
{
    char *s="Hello"; // makes 's' point to a constant
    *s="World";      // modifies what 's' points to
    printf("%s\n",s);
}

第一行代码s指向一个常量。第二行尝试修改s指向的内容。所以你试图修改一个常量,你不能这样做,因为一个常量是……嗯……常量。

于 2013-08-22T19:41:21.860 回答
2

因为*s不是charchar*字符串)

于 2013-08-22T19:38:07.623 回答
2
char *s="Hello";

声明一个指向字符串文字的指针"Hello"。这可能存在于只读内存中,因此该行

*s="World";

是导致未定义的行为。崩溃是未定义行为的有效(且有用)形式。

以下任何一种选择都可以

const char* s = "Hello";
s="World";
printf("%s\n",s);

char s[16] = "Hello";
strcpy(s, "World";)
printf("%s\n",s);
于 2013-08-22T19:39:34.370 回答
1

s创建时指向静态(全局)内存。您不能在运行时重新分配给该内存,因此会发生崩溃。

于 2013-08-22T19:39:48.673 回答
1

*s是字符串的第一个字符,因此将字符串分配给字符会出错。

如果你想评估字符串使用s = "world"

int main()
{
    char *s="Hello";
    s="World";
    printf("%s\n",s);
}

现在尝试它会工作。

char*s="hello";这里s是只读位置。所以我们可以分配另一个字符串,但不能重写新字符串。

s = "hello"; //work
strcpy(s, "hello"); //segmentation fault
于 2013-08-22T19:40:38.370 回答
1

这里有两个问题。

该声明

*s = "World";

取消引用 s,它为您提供字符串的第一个字符"Hello",或'H'. 因此,您尝试将指针值(字符串“World”的地址)分配给单个char对象("Hello"字符串文字的第一个字符)。

但...

在某些系统上(显然是您的系统),字符串文字存储在只读数据段中,尝试修改只读内存将导致某些系统出现运行时错误。因此崩溃。

要更改s指向“World”字符串文字,只需删除取消引用:

s = "World";
于 2013-08-22T19:49:34.357 回答
1

*s 与 s[0] 相同。s[0] 有空间存储单个字符;在这种情况下是“W”。

该角色中没有空间存储“世界”的位置。

这就是您遇到分段错误的原因。

于 2013-08-22T19:53:28.027 回答