字符串指针和strcpy

时间:2017-04-05 13:45:27

标签: c string pointers segmentation-fault 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';
}

1 个答案:

答案 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.