我不明白这个小程序的结果

时间:2015-03-03 03:23:55

标签: pointers arguments malloc

我已经制作了这个小程序来测试更大程序的一小部分。

    int main()
{
    char c[]="ddddddddddddd";
    char *g= malloc(4*sizeof(char));
    *g=NULL;
    strcpy (g,c);

    printf("Hello world %s!\n",g);
    return 0;
}

我预计该函数将返回" Hello World dddd" ,因为g的长度是4 * sizeof(char),但它返回" Hello World dddddddddddddd"。你可以解释一下我错在哪里吗?

1 个答案:

答案 0 :(得分:1)

不要这样做,这是未定义的行为。

strcpy函数很乐意在c 中复制所有这些字符,无论大小为g

这是因为它将字符复制到\0中的第一个c。在这种特殊情况下,它可能会损坏您的堆,或者它可能不会,这取决于在堆中分配的事物的最小大小(例如,许多具有16个字节的“分辨率”)。

如果您希望代码更加健壮,可以使用其他功能(尽管它们是可选的),例如strncpy(如果您了解限制)或strcpy_s(),详见ISO C11标准的附录K(以及之前的迭代)。

或者,如果由于某种原因无法使用它们,则由开发人员决定是否确保它们不违反规则。