2015-03-03 38 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