int main()
{
char *s="Hello";
*s="World";
printf("%s\n",s);
}
Why does the above program result in a segmentation fault?
int main()
{
char *s="Hello";
*s="World";
printf("%s\n",s);
}
Why does the above program result in a segmentation fault?
int main()
{
char *s="Hello"; // makes 's' point to a constant
*s="World"; // modifies what 's' points to
printf("%s\n",s);
}
第一行代码s
指向一个常量。第二行尝试修改s
指向的内容。所以你试图修改一个常量,你不能这样做,因为一个常量是……嗯……常量。
因为*s
不是char
(char*
字符串)
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);
s
创建时指向静态(全局)内存。您不能在运行时重新分配给该内存,因此会发生崩溃。
*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
这里有两个问题。
该声明
*s = "World";
取消引用 s
,它为您提供字符串的第一个字符"Hello"
,或'H'
. 因此,您尝试将指针值(字符串“World”的地址)分配给单个char
对象("Hello"
字符串文字的第一个字符)。
但...
在某些系统上(显然是您的系统),字符串文字存储在只读数据段中,尝试修改只读内存将导致某些系统出现运行时错误。因此崩溃。
要更改s
为指向“World”字符串文字,只需删除取消引用:
s = "World";
*s 与 s[0] 相同。s[0] 有空间存储单个字符;在这种情况下是“W”。
该角色中没有空间存储“世界”的位置。
这就是您遇到分段错误的原因。