[英]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 Leak
, Memory Corruption
和其他不需要的結果,因此您應該避免在不需要時執行此類操作並保持干凈和常規代碼(使此10
保持不變並避免處理未分配的內存 )。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.