2016-02-14 65 views
-4
#include <stdio.h> 
#include <stdlib.h> 

int main() { 
    system("clear"); 
    int *pt = malloc(2 * sizeof *pt); 
    int *tmp = NULL; 
    int i; 

    pt[0] = 44; 
    pt[1] = 9; 
    printf("pt[0] : %d\n", pt[0]); 
    printf("pt[1] : %d\n", pt[1]); 
    tmp = realloc(pt, 3 * sizeof *pt); 
    if (!tmp) { 
     printf("merde alors\n"); 
    } else { 
     pt = tmp; 
     for (i = 0; i < 5; i++) { 
      pt[i] = i + 1; 
      printf("pt[%d] : %d\n", i, pt[i]); 
     } 
    } 
    //the compiler should give me an error here, because I try use an unallocated memory: 
    printf("pt[%d] : %d\n", i + 8, pt[i + 8]); 
    free(pt); 
    return 0; 
} 

大家好:) 我不明白,正如你所看到的,我嘗試使用未分配的內存,所以我期望從編譯器接收到一個積極的錯誤。 請原諒我的英文不好。 感謝您的時間:) Valgrind report :編譯器爲什麼不給我錯誤?

+0

有些事情你只需要調試。它不能顯示僅在運行時出現的錯誤。 –

+0

即使數組是硬編碼的,C編譯器也不會阻止您索引超出其範圍。對於一個指針,編譯器甚至可能不知道你將在運行時分配多少內存。這取決於你檢查數組索引。 –

+0

根據您的開發環境,您可能會發現像valgrind這樣的調試工具很有用。 Valgrind能夠在運行時查明這類錯誤。 http://valgrind.org/ –

回答

5
//the compiler should give me an error here, because i try use an unallocated memory: 
    printf("pt[%d] : %d\n", i+8, pt[i+8]); 

通常你不會從編譯器得到這樣的錯誤,它是由你來保持它的軌道。這就是C的美麗或黑暗面。如果發生這樣的問題,那就是undefined behaviour(UB),其結果更糟糕。

所以它取決於你。有些編譯器標誌或靜態分析器可能會在有明顯的數組越界訪問時幫助你。

這同樣適用於許多其他的相關問題,在其編譯器不會警告你,你會得到UB - 這就是爲什麼在語言如C或C++,你真的需要知道你在做什麼。

同樣在這種特殊情況下,如果要指定在運行時數組的大小,編譯器可能甚至不知道該數組的大小將是什麼 - 因此它不能給你一個錯誤。即使它知道,編譯器也不會總是告訴你有關數組越界訪問。

+0

謝謝你這是一個好文章 – younesky

+0

@younesky歡迎您,您可以進一步瞭解更多有關UB,如果你有興趣的語言,如C或C++ –

+0

我愛C,它是很難的,但它給了我最大程度的控制 – younesky

0

編譯器不檢查,看看是否你所訪問的內存存在在編譯時。這一切都是在運行時由您的操作系統完成的。 C本身不會導致分段錯誤的發生,但實際上你的操作系統告訴C停止。

+0

我沒有看到Giorgi已經寫過這個回覆,我的不好! :) – dustinroepsch

+0

這很好,可以有多個答案,如果你認爲你是添加一些東西 –

相關問題