我已经制作了这个小程序来测试更大程序的一小部分。
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"。你可以解释一下我错在哪里吗?
答案 0 :(得分:1)
不要这样做,这是未定义的行为。
strcpy
函数很乐意在c
中复制所有这些字符,无论大小为g
。
这是因为它将字符复制到\0
中的第一个c
。在这种特殊情况下,它可能会损坏您的堆,或者它可能不会,这取决于在堆中分配的事物的最小大小(例如,许多具有16个字节的“分辨率”)。
如果您希望代码更加健壮,可以使用其他功能(尽管它们是可选的),例如strncpy
(如果您了解限制)或strcpy_s()
,详见ISO C11标准的附录K(以及之前的迭代)。
或者,如果由于某种原因无法使用它们,则由开发人员决定是否确保它们不违反规则。