为什么这个程序会给出分段错误
int main()
{
char *ptr;
ptr = (char *)malloc(15*sizeof(char));
ptr = "string";
strcpy(ptr,"NewString");
}
虽然这没有
int main()
{
char *ptr;
ptr = (char *)malloc(15*sizeof(char));
strcpy(ptr,"String");
ptr = "Newstring";
}
或类似的程序,当要修改字符串中的一个文本时
int main()
{
char *ptr;
ptr = "string";
ptr[1] = 's';
}
当这不
int main()
{
char *ptr;
ptr = (char *)malloc(15*sizeof(char));
strcpy(ptr,"String");
ptr[1] = 's';
}
上述所有方案都会导致未定义的行为。
为了便于解释,我们按照出现的顺序将四个片段称为 (I(、(II(、(III( 和 (IV(。
-
因此,在(I(中,
strcpy(ptr,"String");
是尝试写入不可写内存(尝试修改字符串文字,换句话说(。 -
在 (II( 中,
strcpy(ptr,"String");
会导致内存溢出,因为目标的空间小于源空间。 -
在 (III( 中,
ptr[1] = 's';
是修改(部分(字符串文字的尝试。 -
在(四(中,与(二(相同。
您无法推理导致 UB 的程序的结果。分段错误是UB的众多可能的副作用之一,而不是唯一的副作用。
也就是说,请参阅此讨论,了解为什么不在C
中转换malloc()
和家庭的返回值。