2016-04-03 13 views
-1

Ich codiere in C.Wie füge ich int zu einem int ** hinzu?

Ich erhalte folgende Variable als Argument int** list.

Ich Zuweisung des Speichers wie folgt aus:

list = (int **)malloc(sizeof(int) * numberOfItems); 

ich durch eine andere Liste bin Looping und ich möchte eine ganze Zahl auf die list Variable hinzuzufügen. Hier ist mein Code:

*list[i] = i; 

Ich erhalte die folgende Fehlermeldung:

[1] 18404 segmentation fault program 

Was habe ich falsch gemacht?

+2

'Liste' ist ein 2D-Array. Sie ordnen Speicher nicht richtig zu. –

+1

Zum @ FiddlingBits Kommentar hinzufügen: siehe das Beispiel http://StackOverflow.com/a/1970774 Sie haben übersehen, dass '**' auf Zeiger zeigt, nicht auf 'int', also auf' sizeof * '. Auch die Schleife. –

+1

@FiddlingBits: 'int **' ist ** nicht ** ein 2D-Array und kann nicht als ein verwendet werden! Ein Zeiger, der für ein 2D-Array verwendet werden kann, ist 'int (*) [COLS]' – Olaf

Antwort

0

Wie @FiddlingBits darauf hinwies, war meine Zuweisungsmethode falsch.

Hier ist die fix:

int *workList = (int *)malloc(sizeof(int) * hardworkingDwarfCount); 
list = &workList; 

Und:

workList[i] = i; 
+1

Sieht so aus, als würde es funktionieren. Um auf das 'workList'-Array über' list' zuzugreifen, müßtest du etwas wie '(* list) [i]' oder 'list [0] [i]' machen, oder? –

+0

@FiddlingBits: Nein! 'worklist' ist ein Zeiger auf' int', um auf jedes Element zuzugreifen, das Sie für die normale Indizierung verwenden: 'worklist [i]'. – Olaf

+0

@Olaf Ich spreche von 'liste', nicht' worklist'. –

1

Obwohl notwendig, in C++, es nicht notwendig ist (nor suggested) Sie die Rückkehr von [m][c][re]alloc in ANSI C zu werfen So erste Aussage sollte sein: (beachte das Argument der sizeof Aussage ...)

list = malloc(sizeof(* list) * numberOfRows);//create the first level of array of pointers 

Dann Schleife durch, wie Sie in Ihrem Beitrag angezeigt haben, Speicher für jeden der Standorte in der ersten Anweisung erstellt Zuweisung:

for(i=0;i<numOfRows;i++) 
{ 
    list[i] = malloc(sizeof(int)); 
} 

Hinweis: in Anerkennung @ MM Kommentar, obwohl es nicht notwendig oder allgemein empfohlen (siehe Link oben), um die Rückgabe von malloc in C zu casten. Der Beispielcode, den Sie in Ihrem ursprünglichen Beitrag bereitstellen, bietet eine gute Illustration für die Verwendung der Darsteller und stellt sofort die Möglichkeit eines Fehlers dar. d.h., dass die Besetzung: (int **) nicht mit dem Argument sizeof: int übereinstimmt.

+0

Die Besetzung hilft jedoch, Fehler zu vermeiden. Mit '(int **) malloc (sizeof (int)' können wir sofort sehen, dass es einen Fehler gibt. Und wenn der Rückgabetyp falsch ist, findet der Compiler den Fehler. Wenn OP 'list = malloc (sizeof (int) 'dann ist es weniger offensichtlich.Wenn Sie nicht Casting empfehlen, sollten Sie auch das Formular 'list = malloc (sizeof * list') empfehlen, da wir dann auch sehen, dass es keinen Fehler gibt. Ihr Vorschlag ist die schlechteste der 3 Optionen, wirklich –

+0

@MM - Ich stimme stark mit "sizeof * list" überein. Dass ich versäumte, dies als Fehler zu bezeichnen. Ich stimme jedoch nicht zu, dass die Ausgabe von 'malloc()' _allgemein_ eine gute Idee in ANSI C ist ein guter Grund in diesem Fall, dass die Besetzung, wäre ein unmittelbarer Hinweis darauf, dass die Dinge nicht in einer Reihe waren. Aber wie Sie wissen, ist die ewige Debatte über Casting 'malloc()' und Familie in C noch am Leben und gesund Ich falle auf die Seite des Arguments, das besagt, dass es noch schlimmeres Casting gibt (nur für C) als ich selbst. Ich habe jedoch für deinen ersten Vorschlag bearbeitet. Danke. – ryyker

+0

Meiner Erfahrung nach sind Typenkonfliktfehler viel häufiger als C99 nicht enthalten –

Verwandte Themen