2016-10-22 72 views
-2

我最近發現,C的溫度將允許我做如下操作:寫作超出數組的末尾用C

char* myArray[1]; 

myArray[0] = malloc(1024 * sizeof(char)); 
strcpy(myArray[0], "Hello"); 

myArray[1] = malloc(1024 * sizeof(char)); 
strcpy(myArray[1], "World"); 

//repeat ad absurdum 

有效地讓我填myArray儘可能多的數據指針,因爲我喜歡,雖然只首先明確請求一個指針的內存。

爲什麼允許這樣做? 這是否被認爲是良好的做法,或者這可能導致未預見到的後果? 根據我的理解,數組中的不同索引在內存中彼此相鄰分配,並且由於在初始化數組時,從未顯式請求過myArray[1]的地址,因此它可能會被其他數據佔用。

+2

它早就說過,C讓你有能力在腳下自我射擊。我不知道也不在乎你是否是一名負責任的槍主。基本上,邊界檢查需要時間。時間不適用於其他事情。在編制停車計時器時,這並不重要。當編寫遊戲,模擬或太空飛船時,這樣的奢侈時間是無法承受的。 – enhzflep

+2

這就是爲什麼編程C時,應該利用每個編譯器警告,靜態分析器和動態檢查器工具。 (ASAN,valgrind,splint等)不幸的是,因爲'myArray'在這裏看起來是一個棧變量,所以valgrind不會捕獲不良的訪問,因爲你實際上只是在棧上搗毀下一個變量。 –

+1

-fsanitize = address(clang和gcc)可能有助於調試由內存錯誤引起的錯誤。像valgrind這樣的工具也可以提供幫助。但是像Jonathon說的那樣,捕捉堆棧處理錯誤對於外部工具來說是不可能的。 –

回答

3

C是一種非常不安全的語言。你通常可以做任何你想做的事情,並且通過做你所做的事情來毀掉記憶。通常在簡單的程序中你不會注意到這些效果,但它很快就會變得明顯。

總之 - 這是允許的但危險的,不應該這樣做。

在c編程時,你必須檢查每一行。

1

C沒有對數組訪問進行邊界檢查,並且嘗試讀取或寫入數組末尾導致未定義的行爲。緩衝區溢出是常見的惡意軟件漏洞。

+0

+1提到緩衝區溢出。但我想你應該詳細說明一點,讓OP知道他們有多討厭。 –