簡體   English   中英

為什么我可以寫一個已分配0空間的內存?

[英]why can I write over a piece of memory which has been allocated 0 space?

為什么我將大小為0的空間分配給數組但我仍然可以寫入那段內存?

#include<stdio.h>

int main(int argc, char** argv)
{
   int * array = malloc((sizeof(int)) * 0);
   int i;
   for(i = 0; i < 10; i++)
      array[i] = i;

   for(i = 0; i < 10; i++)
      printf("%d ", array[i]);
}

您訪問索引越界時代碼調用未定義的行為 -

 for(i = 0; i < 10; i++)
 array[i] = i;

您不會收到有關此類事情的任何警告或錯誤,但這是在UB的標准中記錄的。

在這種情況下,輸出可以是任何東西。

而對於這一行 -

int * array = malloc((sizeof(int)) * 0);

C標准說 -

如果請求的空間大小為零,則行為是實現定義的:返回空指針,或者行為就像大小是非零值一樣,但返回的指針不應用於訪問對象。

這里它的返回可能是也可能不是NULL pointer 但很明顯,這個指針不應該用於訪問任何對象。

參數為0 malloc返回NULL或可以傳遞給free的唯一指針。 如果它確實返回一個非null值,並且該指針指向一個對你的程序有效並且可寫的頁面內的內存,那么如果你試圖寫入它,操作系統將不會摧毀你,但你最終可能會重寫一些程序數據的一部分(=>未定義的行為)。

C是一種不安全的語言 作為一種不安全的語言,它允許您執行以下有風險的操作:

  • 寫入/讀取未分配的內存。
  • 外觀鑄造類型( void*為其他類型,反之亦然)。
  • 沒有綁定檢查。
  • 內存Unmanaged
  • 等等...

由於這些操作存在風險並且可能導致Memory LeakMemory Corruption和其他不需要的結果,因此您應該避免在不需要時執行此類操作並保持干凈和常規代碼(使此10 保持不變並避免處理未分配的內存 )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM