2017-10-11 52 views
-2

我爲char指針分配了一些空間,並嘗試訪問超出分配空間但仍然沒有分段錯誤。我的代碼如下:超出分配的空間,並沒有獲得段錯誤

char *src = malloc(4); 
    strcpy(src, "1234"); 
    char *temp; 
    for(int i = 0 ; i<5 ; i++) { 
     temp = src; 
     srC++;  
     printf("ite ch %c\n",src[0]); 
    } 
    printf("Still no segfault %s\n",temp); 

現在我的問題是:我怎麼能超越分配的空間?我不應該得到分段錯誤嗎?

+5

未定義的行爲是未定義的。不能保證它被檢測到。 – Deduplicator

+0

C是低級語言。它會高興地讓你在腳下自己射擊,你可能會也可能不會警告你。 –

+1

「我不應該得到分段錯誤嗎?」 C號不會指定你_should_ seg故障。它可能會發生。這是UB。其他語言可能會指定seg故障必須發生。這通常需要額外的代碼或性能。如果需要[訓練輪](https://en.wikipedia.org/wiki/Training_wheels),請考慮其他語言。 – chux

回答

1

當您在malloc分配的內存塊的末尾寫入數據時,如您在此處所做的那樣,您調用undefined behavior

未定義的行爲意味着程序的行爲無法預測。它可能會崩潰,它可能會輸出奇怪的結果,或者它可能看起來正常工作。另外,一個看似不相關的變化,例如添加一個未使用的局部變量或調用printf以進行調試,可以改變未定義行爲的體現方式。

總而言之,對於未定義的行爲,僅僅因爲程序可能崩潰並不意味着它會。

0

malloc()函數的實現是系統和庫特定的。許多內存分配實現必須處理的事情之一是內存碎片。

問題代碼分配4個字節。爲了最大限度地減少內存碎片,許多系統實際分配的內存超過4個;也許最少16個字節。這樣做既滿足malloc(4)請求,也將內存碎片(一旦內存被釋放)保持爲最小16字節大小。因此,可以使用16字節片段的「內存片段池」來滿足1到16字節的malloc()請求。

許多內存管理系統每個維護16,32,64,128(等)字節的「內存片段池」。例如,如果調用malloc(44),則來自64字節池的內存片段可以滿足請求。

在某些系統上,有一個規定來確定malloc()返回的內存片段的實際大小。在Linux系統上,函數malloc_usable_size()執行此功能。 OS X系統可以使用malloc_size()。