2016-06-11 7 views
-1

Ich habe einige Code wie folgt:Array-Adresse in C++

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

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

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

Mit Eingang: 1 10 fand ich, dass der Wert von array[0] geändert wurde, statt 10 es das gleiche hat mit tmp[0].

Dann erkannte ich mit diesem Eingang die Länge tmp[] wurde Null. Also ich drucke die Adresse array[] und tmp[] mit:

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

und fanden sie die gleiche Adresse hatte.

Ich möchte herausfinden, was passiert, wenn ein Array eine Länge von 0 hat; so habe ich versucht, dies:

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

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

Adresse:

array[]: 1363909056 
tmp[] : 1363909052 

Es sieht genauso aus wie der vorherige Code (außer dem Eingangsteil). Aber tmp[0] und array[0] hat andere Werte und Adresse jetzt.

Und ich bin wirklich verwirrt, dass tmp hat kleinere Adresse dann array.

Also meine Frage ist:

  1. Was passiert, wenn ich ein Array mit der Länge Null erklären?
  2. Warum funktionieren diese beiden Codes anders? (sie sehen gleich aus :))
+5

'int array [n];' ist nicht standard C++. –

+0

Ich habe viel mit verschiedenen 'Deklarationen' versucht, aber es macht nur mehr verwirrt – mzhty

+3

'tmp [0] = 1;' ruft einfach undefiniertes Verhalten auf. Nicht wirklich würdig, an ein Ergebnis zu denken, auf das von 'tmp [0] 'danach zugegriffen wird. –

Antwort

0

Dies wird "undefined Verhalten" genannt. Nach der Erklärung, in Ihrem Fall

int tmp[0]; 

Das nächste, was passiert ist:

tmp[0]=1; 

Da tmp[0] nicht existiert, das nicht definiertes Verhalten ist. Ihr Problem besteht nicht darin, dass das Array mit der Größe 0 deklariert wurde (das ist nicht unbedingt koscher, sondern ist hier nicht das Problem), aber das undefinierte Verhalten als Ergebnis des Überschreibens von Speicher nach dem Ende des Arrays.

+0

* Nicht genau koscher * ist eine gute Art schlecht zu sagen :) – SergeyA