与c中的指针相关的分段故障

时间:2013-08-22 19:37:11

标签: c

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

为什么上述程序会导致分段错误?

7 个答案:

答案 0 :(得分: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指向的内容。所以你试图修改一个常量,你不能这样做,因为常量是......好......常数。

答案 1 :(得分:2)

因为*schar而不是char*(字符串)

答案 2 :(得分: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);

答案 3 :(得分:1)

s在创建时指向静态(全局)内存。您无法在运行时重新分配该内存,因此崩溃。

答案 4 :(得分: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

答案 5 :(得分:1)

这里有两个问题。

声明

*s = "World";

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

但是...

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

要将s更改为指向到“世界”字符串文字,只需删除取消引用:

s = "World";

答案 6 :(得分:1)

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

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

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