簡體   English   中英

解釋此C代碼的輸出?

[英]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) {…}

argcargv的名稱並不重要,但類型很重要。 如果您忘記了這些參數,惡魔可能會從您的鼻子中飛出。

暫無
暫無

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

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