2014-11-23 30 views
0

我期望看到編譯錯誤從這個代碼,並可能在運行可執行文件時出現錯誤。根據我的理解,如果一個指針被分配並存在於堆中,並且malloc爲指針保留空間,如果放置在指針處的內容太大,它應該開始覆蓋代碼空間。但是,這在Linux 64位Ubuntu 14.04上沒有問題。Malloc分配太少的空間,但代碼編譯和運行沒有錯誤

在這個例子中,我最初保留了5個字節,但是在這個存儲器地址上放了21個字節(\ 0將是字節21?)。該程序運行沒有問題,編譯器不會引發錯誤。

我使用命令編: 「GCC -Wextra -pedantic test.c的-o測試」

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main() 
{ 
    char *str; 

    /* Initial memory allocation */ 
    str = malloc(5); 
    strcpy(str, "123456789"); 
    printf("String = %s, Address = %p\n", str, str); 

    /* Reallocating memory */ 
    str = realloc(str, 26); 
    strcat(str, "12345"); 
    printf("String = %s, Address = %p\n", str, str); 

    free(str); 
    return(0); 
} 
+4

您的代碼中存在未定義的行爲。它完美運作的原因是純粹的運氣。意味着任何事情都可能發生。 – 2014-11-23 05:40:01

回答

0

malloc的將返回一個塊大於5個字節。我猜它在實現上有所改變,但快速谷歌搜索說16個字節。

我不希望編譯器生成編譯錯誤(儘管可能是警告?)

0

在C語言中,如果發生緩衝器溢出而無需添加某種邊界檢查的不給出錯誤或警告。由於您正在讀寫無效內存,因此您的代碼輸出未定義。有時候你可能會很幸運並且會出現分段錯誤,並且你馬上知道自己有訪問違規。

您可以通過運行valgrind ./test來看到您的讀取和寫入操作無效。我鼓勵您熟悉valgrind作爲一種調試工具,用於檢測內存管理錯誤,例如您在代碼中引入的錯誤。

相關問題