#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?
function1寫入已分配空間的末尾。 function2以及 – usr
這些函數中的每一個都表現出**未定義的行爲**。您正在訪問(並在此情況下正在寫入)分配範圍之外的內存。 – WhozCraig