int main()
{
char *s="Hello";
*s="World";
printf("%s\n",s);
}
为什么上述程序会导致分段错误?
答案 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)
因为*s
是char
而不是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'。
没有空间将“世界”的位置存储在该角色中。
这就是你遇到分段错误的原因。