2017-01-30 39 views
0

這是我的代碼。通過malloc()將4個字節複製到有3個字節的保留內存的位置。根據我的知識,由於內存不足,字符串不會以null結尾。即ABC在堆區中佔3個字節。這裏因爲null沒有在最後printf不能打印q.ptr但打印"ABC"。這怎麼可能?Printf()不會顯示未定義的行爲,並且不會由null結尾的字符串

#include<stdio.h> 
#include<string.h> 
#include<stdlib.h> 
struct p 
{ 
    char *ptr; 
}; 
void main() 
{ 
    struct p p,q; 
    p.ptr="ABC"; 
    q.ptr=(char *)malloc(3*sizeof(char)); 
    strcpy(q.ptr,p.ptr); 
    printf("%s\n",q.ptr); 
} 
+0

未定義行爲不需要導致崩潰或分段錯誤或類似的東西。該計劃也可以按預期工作,而不會產生任何問題。但不要每次都依靠這個。有一次,你的程序可能正常工作,但下一次,它可能不會!不惜一切代價避免UB! –

+1

「顯然工作鰭」是「未定義的hebaviour」的一部分。 –

回答

6

strcpy不知道您的緩衝區太短。它只寫了4個字節,有1個越界。

可能墜毀在這一點(如果你打一個頁面邊界,例如嘗試運行與電圍欄啓用在Linux(-lefence鏈接選項)),或對其他地區的一個討厭的副作用你的程序。

所以printf正常工作,但你可能已經寫在某個你不允許的地方。

相關問題