2016-06-11 87 views
-1

我有這樣一些代碼:陣列地址

int n; 
cin >> n; 
int array[n]; 

for (int i = 0; i < n; ++i) { 
    cin >> array[i]; 
} 

int tmp[n - 1]; 
tmp[0] = 1; 

隨着輸入:1 10我發現的array[0]值被改變,而不是10它具有與tmp[0]相同。

然後我意識到輸入的長度爲tmp[]變成零。所以,我打印的array[]tmp[]與地址:

printf("%d\n %d\n", array, tmp); 

,發現他們有相同的地址。

我想弄清楚如果一個數組的長度爲0會發生什麼;所以我想這:

int array[1]; 
array[0] = 10; 

int tmp[0]; 
tmp[0] = 1; 

地址:

array[]: 1363909056 
tmp[] : 1363909052 

它看起來就像以前的代碼(除輸入部分)。但是tmp[0]array[0]現在有不同的值和地址。

我真的很困惑tmp有更小的地址,然後array

所以我的問題是:

  1. 如果我聲明長度爲零的數組,會發生什麼?
  2. 爲什麼這兩個代碼的工作原理不同? (他們看起來一樣:) :)
+5

'int array [n];'不是標準的C++。 –

+0

我試了很多不同的'聲明',但它只是使更多的困惑 – mzhty

+3

'tmp [0] = 1;'只是調用未定義的行爲。其後,從'tmp [0]'中訪問結果並不值得考慮。 –

回答

0

這被稱爲「未定義的行爲」。聲明,你的情況

int tmp[0]; 

接下來發生的事情後是:

tmp[0]=1; 

由於tmp[0]不存在,這是不確定的行爲。你的問題不是數組聲明的大小爲0(根據其自身的優點不完全是猶太教,但這不是問題),但是由於覆蓋內存超過數組末尾而導致未定義的行爲。

+0

*不完全是猶太教*是一種說法不正確的好方法:) – SergeyA