C语言 字符串指针和 strcpy



为什么这个程序会给出分段错误

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()和家庭的返回值。

相关内容

  • 没有找到相关文章

最新更新