[英]Explain the output of this C code?
我今天只是出於實驗目的而編寫了這段代碼,我試圖找出輸出結果。
/*
* This code in C attempts to exploit insufficient bounds checking
* to legitimate advantage.
*
* A dynamic structure with the accessibility of an array.
* Handy for small-time code, but largely unreliable.
*/
int array[1] = {0};
int index = 0;
put(), get();
main ( )
{
put(1); put(10), put(100);
printf("%6d %5d %5d\n", get(0), get(1), get(2));
}
put ( x )
int x;
{
array[index++] = x;
}
get ( index )
int index;
{
return array[index];
}
輸出:
1 3 100
那里存在一個問題,因為您將'array'聲明為長度為1的數組,但是向其中寫入了3個值。 至少應為“ array [3]”。 否則,您將寫入未分配的內存,因此任何事情都可能發生。
它在那里沒有修復就輸出'3'的原因是它正在輸出全局'index'變量的值,這是內存中的下一個int(在您的情況下-正如我所說的,任何事情都會發生)。 即使您確實使用put(10)
調用覆蓋了該索引,該索引值仍被用作分配中的索引,然后進行后遞增,這會將其設置回2-然后在末尾將其設置為3。 put(100)
調用,隨后通過printf輸出。
這是未定義的行為,因此唯一真正的解釋是“它在一台計算機上執行某些操作,而另一台計算機上執行其他操作”。
另外,K&R函數的語法是什么?
編輯: printf
猜測是錯誤的。 關於語法,請閱讀K&R 2nd Edition(封面帶有紅色ANSI標記),該版本使用了現代函數語法(以及其他有用的更新)。
為了擴展所說的內容,訪問越界數組成員將導致未定義的行為。 未定義的行為意味着實際上可能發生任何事情。 除非您深入了解特定於平台的深奧黑客,否則無法利用未定義的行為。 不要這樣
如果您確實需要“動態數組”,則必須自己進行處理。 如果您的要求很簡單,則只需malloc
並重新realloc
一個緩沖區。 如果您的需求更為復雜,則可能需要定義一個結構,該結構保留單獨的緩沖區,大小和計數,並編寫在該結構上運行的函數。 如果您只是學習,請嘗試兩種方式。
最后,您的函數聲明語法是有效的,但卻是過時的。 這種形式很少見,在新代碼中幾乎聞所未聞。 聲明put
為:
int put(int x) {…}
並始終將main
聲明為:
int main(int argc, char **argv) {…}
argc
和argv
的名稱並不重要,但類型很重要。 如果您忘記了這些參數,惡魔可能會從您的鼻子中飛出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.