2016-06-07 24 views
0

這是我的代碼。我正在玩一小段我寫的代碼。這是C內存溢出或覆蓋的情況嗎?

儘管指針的字符數組是2個元素,但即使它只有2個元素,我也能夠間接使用該字符數組的指針地址寫入存儲器位置。

我可能以錯誤的方式思考它,或者因爲我今天過度施展。

我希望有人可以對此有所瞭解。

#include <stdio.h> 

int main(void) 
{ 
    char a[] ="GKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3u"; 
    char b[] ="GKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3uGKdkOSwdDMjQKT6fgZ3u"; 
    char *line_store[2]; 
    *(line_store) = a; 
    *(line_store + 2) = b; 
    printf("%s\n\n", *(line_store)); 
    printf("%s\n\n", *(line_store+1)); 
    printf("%s\n\n", *(line_store+2)); 
    return 0; 
} 
+0

@kaylum我真的嘗試不創建任何重複的線程,我肯定相信,它不完全是一個重複的情況,而是一個稍微微妙的版本,也許? – Avineshwar

+1

爲什麼?您讀取/寫入超出界限的數組元素。這有什麼不同呢?底線是它是未定義的行爲。你期望它會以某種方式失敗是不正確的。 UB在場時你不能有這樣的期望。 – kaylum

+0

描述性是一個更好的詞。這篇文章有一個最低限度的情況例子,我相信我通過我的代碼和底線解釋了我的問題並不僅限於此處未定義的行爲。 – Avineshwar

回答

4

您的代碼有效,因爲C不會對您的數組進行任何邊界檢查。你正在寫的內容超出了你分配的最後一個元素,這導致它寫入內存中的未分配空間。這可能是偶然發生的,隨後的運行在理論上可能會崩潰,或者覆蓋其他有效的內存段,這取決於在更大的程序中何處以及如何完成這些內存段。

+0

哦,是的,邊界檢查!我希望在不使用編譯器的幫助下使這段代碼失敗,或者這不是一個好的選擇,而是我應該依靠編譯器標誌(s)? – Avineshwar

+0

你想讓程序崩潰嗎? – CDahn

+0

我的意思是我應該崩潰吧?因爲這看起來不太好,不是嗎?至少編譯(可能是因爲某些編譯器標誌)應該失敗。 – Avineshwar