2015-03-03 36 views
0

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

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 ddddddddddddd”。可你解释我在哪里,我错了?

回答

1

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

strcpy功能会很乐意复制所有这些字符在c无论g大小

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

如果您希望自己的代码更健壮,您可以使用其他函数(如strncpy(前提是您了解这些限制))或strcpy_s()(详见ISO的附录K) C11标准(以及更早的迭代)。

或者,如果您由于某种原因无法使用这些设备,则需要开发人员确保他们不违反规则。

+0

如果我使用for循环,willi会得到相同的错误结果? – 2015-03-03 03:34:05

+0

@CorneilleK,它取决于什么控制'for'循环。如果它是'c'的'strlen()',那么你会遇到同样的问题,是的。根据我的更新还有其他方法。 – paxdiablo 2015-03-03 03:35:27