2013-10-27 69 views
0
#include<iostream> 
using namespace std; 


char* function1() 
{ 
    char* var = new char; 
    var[0] = 'q'; 
    var[1] = 'p'; 
    return var; 
} 


int* function2() 
{ 
    int* var = new int; 
    var[0] = 12; 
    var[1] = 20; 
    return var; 
} 


int main() { 

    cout << function1() << endl; 
    cout << function2() << endl; 
    // your code goes here 
    return 0; 
} 

輸出:一些澄清了以下程序

qp 
0x9cf9018 

有這個計劃有些疑惑。任何討論對理解這些事情都會很有幫助。

1. char* var = new char; 

根據我迄今爲止的理解,此聲明表示:給我一個可以存儲字符的內存位置的地址。所以編譯器會分配一個字節的內存。 那麼,爲什麼我們能夠存儲任何數目的字符爲:

var[0] = 'q'; 
var[1] = 'p'; 
var[1] = 'r'; 

如果答案是因爲連續內存的位置,我們就可以訪問下一個存儲器,然後是我們不訪問一些東西,不給我們。並在不知不覺中覆蓋屬於他人的東西。如果答案是肯定的,那麼爲什麼編譯器允許我們這樣做。以及如何避免這件事。另外,如果我們不避免這個問題,我們可以在多次運行該程序時獲得一些意想不到的結果嗎?

2. The answered behavior of above point is same for int* var = new int; and char* var = new char, or is different. And if is different, what is the difference? 

3. why one cout is printing value, while other printing address? 
+1

function1寫入已分配空間的末尾。 function2以及 – usr

+1

這些函數中的每一個都表現出**未定義的行爲**。您正在訪問(並在此情況下正在寫入)分配範圍之外的內存。 – WhozCraig

回答

1

1字符* VAR =新字符;

你的理解是正確的。代碼被強制試圖插入其他位置的字符,該調用UB(未定義行爲

2的上述回答的行爲...

見上面

3爲什麼一個cout是打印值,而其他打印地址?

再次UB,爲第一你倒黴得到預期的輸出

0

由於問題1和問題2已經通過P0W回答,問題3的答案是,當你傳遞一個指針null結束字符串到cout,它會打印字符串。

+0

感謝您的回覆。但在這裏,我沒有傳遞指向字符串的指針。它指向char的指針。另外,如果編譯器假設它是字符串,那麼NULL和NULL如何被附加到它? –

+0

@DeveshAgrawal _「who&how NULL ..」_它的UB,沒有理由可以給出。正如我告訴過你非常不情願得到那樣的結果。通常情況下,它應該只顯示一些垃圾值,直到找到一個空字符,在內存中的某些位置 – P0W

+0

指向字符串的指針==指向字符數組的第一個元素的指針。正如P0W所指出的那樣,你很幸運,因爲qp之後有一個空字符。通常行爲是不確定的。有時它會打印垃圾,大部分時間都會導致分段錯誤的崩潰。大多數情況下,堆損壞會導致完全奇怪的行爲,如進程佔用太大空間或者崩潰。這些類型的東西非常難以調試,通常會導致惡夢的調試。 – madrag