int ** vs. int [ZEILEN] [COLS] [doppelt]

8

Ich habe ein 2D-Array wie folgt deklariert:

%Vor%

Wenn ich es jetzt tue:

%Vor%

und:

%Vor%

Ich erhalte einen Segmentierungsfehler (mit g ++ - 4.0).

Warum? Sollte es nicht den Wert 1 ausgeben (gleich arr[0][0] )?

    
PKG 01.06.2010, 16:37
quelle

6 Antworten

1

Sie versuchen, eine Double-Pointer-Variable einem Array zuzuordnen ... dies wurde ausführlich behandelt, siehe hier für Informationen dazu. Außerdem, seit Sie

deklariert haben %Vor%

und versuchen Sie dann, arr einem Doppelzeiger zuzuordnen

%Vor%

was garantiert nicht funktioniert, daher ein Segmentierungsfehler. Darüber hinaus ist diese Anweisung int ** ptr=(int**) arr; tatsächlich umgesetzt in einem Typ (dh [] []) in einen anderen Typ (dh **), obwohl sie vom Typ 'int' sind. . Sie sind beide unterschiedlich und der Compiler wird das sehr unterschiedlich interpretieren ...

Du könntest es so machen:

%Vor%

Nun bezieht sich *(ptr + 1) auf die 0. Zeile, *(ptr + 2) bezieht sich auf die 1. Zeile und so weiter. Die einzige Aufgabe für Sie besteht darin, die Marker, wo arr verwendet wird, nicht zu überschreiten, da sonst ein Überlauf oder sogar ein Segmentierungsfehler auftreten kann ...

    
t0mm13b 01.06.2010, 16:50
quelle
5

Sie können ein lineares Array nicht in einen Pointer-to-Pointer-Typ umwandeln, da int** nicht die gleichen Daten enthält wie int[][] . Der erste enthält Zeiger zu Zeigern zu Zügen. Die zweite enthält eine Sequenz von Ints im linearen Speicher.

    
jweyrich 01.06.2010 16:44
quelle
2

Was Sie jetzt tun, bedeutet, Arrays mit Zeigern zu erstellen, bei denen jeder Zeiger explizit gegossen wurde . Daher hätten Sie ein Array von Zeigern wie ( 0x00001, 0x00002, 0x00003 and 0x00004 ).

Bei der Dereferenzierung verursachen diese Zeiger Ihren segfault.

    
Costantino Rupert 01.06.2010 16:48
quelle
1

Nein, int ** ist ein Zeiger auf einen Zeiger auf ein int, aber ein 2-D-Array ist ein Array von Arrays und &(arr[0][0]) ist ein Zeiger auf ein int.

Ich glaube, du solltest das tun:

%Vor%

oder das:

%Vor%     
Cade Roux 01.06.2010 16:45
quelle
0

Versuchen Sie

%Vor%

Weitere Erklärung:

Sie sollten dem Zeiger eine Adresse zuweisen, so dass er rückgängig gemacht werden kann (ich meine * Operator). Was Sie tun ist, zeigen Sie ptr auf Speicherzelle, die die Adresse a [0] [0] hat. Daher erhalten Sie einen Segmentierungsfehler.

    
Ayberk 01.06.2010 16:40
quelle
0

int arr[2][2] ist kein Array von Arrays - es ist ein einzelnes 2D-Array. Im Speicher ist es nicht von int arr[4]

zu unterscheiden

Was Sie wirklich wollen, ist

%Vor%     
quelle

Tags und Links