我最近發現,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]
的地址,因此它可能會被其他數據佔用。
它早就說過,C讓你有能力在腳下自我射擊。我不知道也不在乎你是否是一名負責任的槍主。基本上,邊界檢查需要時間。時間不適用於其他事情。在編制停車計時器時,這並不重要。當編寫遊戲,模擬或太空飛船時,這樣的奢侈時間是無法承受的。 – enhzflep
這就是爲什麼編程C時,應該利用每個編譯器警告,靜態分析器和動態檢查器工具。 (ASAN,valgrind,splint等)不幸的是,因爲'myArray'在這裏看起來是一個棧變量,所以valgrind不會捕獲不良的訪問,因爲你實際上只是在棧上搗毀下一個變量。 –
-fsanitize = address(clang和gcc)可能有助於調試由內存錯誤引起的錯誤。像valgrind這樣的工具也可以提供幫助。但是像Jonathon說的那樣,捕捉堆棧處理錯誤對於外部工具來說是不可能的。 –