2016-04-08 9 views
-3

Hier ist der Code:Pointers in C mit Arrays

#include <stdio.h> 

int main() 
{ 
    int c[4][4] = {{0,1,2,3},{4,5,6,7},{8,9,10,11},{12,13,14,15}}; 
    int (*p)[3] = (int(*)[3])(c+2); 
    return 0; 
} 

Seine interessant, dass es p sein setzt: {{8,9,10}, {11,12,13}, {14, 15, -8224}}

Ich verstehe nicht, was passiert, vor allem in der 6. Zeile des Codes. Bitte hilf mir!

+5

Gibt es einen Grund, warum Sie verstehen müssen, was in einem Codeabschnitt passiert, der nichts tut und so geschrieben ist, dass niemand Code schreiben sollte? –

+1

'(int (*) [3])' ist ein * Cast *, zu einem Zeiger auf ein Array von drei ganzen Zahlen. Der Ausdruck "c + 2" ist gleich "& c [2]", was ein Zeiger auf das dritte Element von "c" ist. –

+0

Ja, ich muss es wissen, denn überraschenderweise setzt p {{8,9,10}, {11, 12, 13}, {14,15,0}}. – Debdut

Antwort

1

int c[4][4] deklariert ein 2D-Array mit den Dimensionen 4x4.

int (*p)[3] deklariert einen Array-Zeiger auf ein Array von 3 Elementen.

(int(*)[3])(c+2) ruft einen Zeigeraliasing-Fehler auf, indem die Adresse c+2 behandelt wird, als ob dort ein Array von 3 Elementen vorhanden wäre.

Zeigerkonvertierungen zwischen Typ int (*)[4] (der Typ c+2) und Typ int(*)[3] sind nicht sicher. In der Praxis werden die meisten Compiler Ihnen wahrscheinlich ein deterministisches Ergebnis aus diesem Code geben, müssen dies aber nicht tun. Das Programm kann auch abstürzen und brennen und das ist die Schuld des Programmierers.

+0

Ich denke es ist unklar, ob es einen Aliasing Bug gibt. '(int (*) [3]) (c + 2)' ist sicherlich kein Aliasing-Bug, sondern eine Besetzung. Ich nehme an, Sie meinen, dass das anschließende Lesen von 'p [0] [0]' ein Aliasing-Fehler sein könnte. Dies ist jedoch ein Lvalue vom Typ 'int' und greift auf ein Objekt vom Typ 'int' zu, das nicht gegen die strenge Aliasing-Regel verstößt. Der Standard ist hier vage. (Sicherlich gibt es einen Out-of-Bounds-Access-Bug) –

+0

@ M.M Ich muss annehmen, dass sie den Cast gemacht haben, weil sie die Variable irgendwo benutzen wollen. Der angegebene Typ ist ein Array, kein Int. So weit ich es verstehe, ist ein Array von 3 Elementen nicht mit einem Array von 4 Elementen kompatibel. Ein weiteres Problem könnte die Ausrichtung sein, falls "int" ein kleinerer Typ als die Ausrichtungsanforderung ist. Wie auch immer, der Punkt ist: schreibe einfach keinen komischen Code. – Lundin

+0

@ M.M Was ist mit der ersten Dereferenzierung? p [0] ist ein anderer Typ als c [0]. Das ist eine Verletzung von Aliasing. – 2501