为什么这个程序会给出分段错误
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';
}
答案 0 :(得分:1)
上述所有情况都会导致 undefined behavior 。
为了便于解释,我们按照出现的顺序将这四个片段称为(I),(II),(III)和(IV)。
因此,在(I)中,strcpy(ptr,"String");
是尝试写入不可写的内存(尝试修改字符串文字,换句话说)。
在(II)中,strcpy(ptr,"String");
导致内存溢出,因为目标的空间小于源。
在(III)中,ptr[1] = 's';
试图修改(部分)字符串文字。
在(IV)中,与(II)相同。
您无法推断导致UB的程序的结果。分段错误是UB的许多可能的副作用之一,不是唯一的。
那就是please see this discussion on why not to cast the return value of malloc()
and family in C
.。