2016-04-18 7 views
0

Ich versuche, ein Array in c basierend auf den Befehlszeilenargumenten dynamisch zuzuordnen, aber ich bekomme einen Ausnahmefehler. Was mache ich falsch?2D Array mit malloc() Fehler

int **array =(int**)malloc(Argument1); 
for(a=0;a<Argument2;a++) 
    array[a]=(int*)malloc(Argument2); 

und die exeption geworfen wird nach:

__forceinline void * __cdecl _heap_alloc (size_t size) 
{ 
//stuff here 
return HeapAlloc(_crtheap, 0, size ? size : 1); } 

ich an die bekam einmal für Schleife und bekam dann einen Zugriffsfehler bei dem Versuch, die Daten zu lesen, aber jede andere Zeit löst es einen Haltepunkt. Was könnte ich in Visual Studio falsch machen?

+0

Diese mallocs kann möglicherweise nicht korrekt. Erstens, werfen Sie nicht die Rückgabe von malloc in C aus. Zweitens ordnen Sie in Ihrer Schleife immer mehr Speicher zu. Erstes Mal, 1 Byte. Das nächste Mal 2 Bytes (für insgesamt 3), das nächste Mal drei Bytes, usw., bis Sie den Wert von Argument 2 erreichen. –

+0

Sie haben Recht, sie sind nicht korrekt, aber ich kämpfe um herauszufinden, warum sie nicht sind funktioniert – luvAtime41

+0

Sie zeigen nicht den Code, der den Zugriff ausführt, aber Sie sagen, "... bekam einen Zugriffsfehler beim Versuch, die Daten zu lesen ..." –

Antwort

0

Das Argument für die malloc-Funktion ist die Größe in Bytes, nicht in der Anzahl der Elemente, da es für malloc keine Möglichkeit gibt, die Größe jedes Elements zu kennen. Auch die Schleife sollte Argument1 durchlaufen, nicht Argument2.

Versuchen Sie folgendes:

int **array = malloc(arg1 * sizeof(int*)); 
for (int I = 0; I < arg1; I++) { 
    array[I] = malloc(arg2 * sizeof(int)); 
} 
+0

Ich erhalte einen Fehler: "ein Wert vom Typ" void * "kann nicht einer Entität vom Typ" int ** "zugewiesen werden – luvAtime41

+0

VS sagt auch" Typ ist nicht erlaubt "auf der (arg2 * int) Teil – luvAtime41

+2

@ luvAtime41 Pro 1, ich wette, dass Sie den Code als C++ kompilieren, nicht C, weil malloc in C eine void *, auch bekannt als der allgemeine Zeiger, Sie sollten es nicht werfen war meine Schuld, ich sollte sizeof (int) dort eingeben :) – fluter