malloc in C, aber die Verwendung von multi-dimensionalen array-syntax

Gibt es eine Möglichkeit, malloc eine große Auswahl, aber finden Sie es mit 2D-syntax? Ich will etwas wie:

int *memory = (int *)malloc(sizeof(int)*400*200);
int MAGICVAR = ...;
MAGICVAR[20][10] = 3; //sets the (200*20 + 10)th element


UPDATE: Das war wichtig zu erwähnen: ich will nur einen zusammenhängenden block im Speicher. Ich möchte nur nicht, dass ein makro schreiben wie:

#define INDX(a,b) (a*200+b);

und verweisen dann auf meinem blob wie:

memory[INDX(a,b)];

Ich würde viel lieber:

memory[a][b];


UPDATE: ich verstehe, dass der compiler hat keine Möglichkeit zu wissen, wie es ist. Ich würde sein bereit zu liefern Sie zusätzliche Informationen, so etwas wie:

int *MAGICVAR[][200] = memory;

Nicht syntax wie diese gibt? Hinweis: der Grund, warum ich nicht einfach eine Feste Breite-array ist, dass es zu groß ist, um Platz auf dem stack.


UPDATE: OK, Jungs, ich kann dies tun:

void toldyou(char MAGICVAR[][286][5]) {
  //use MAGICVAR
}

//from another function:
  char *memory = (char *)malloc(sizeof(char)*1820*286*5);
  fool(memory);

Ich bekomme eine Warnung, passing arg 1 of toldyou from incompatible pointer type, aber der code funktioniert, und ich habe festgestellt, dass die gleichen Standorte zugegriffen werden. Gibt es eine Möglichkeit, dies zu tun, ohne mit einer anderen Funktion?

  • Ja, das abgedeckt wurde, viele Male auf SO schon, z.B. C-Programmierung: malloc() für ein 2D-array (Verwendung von pointer-to-pointer)
  • äh sorry, ich sollte sagen, dass ich nicht wollen, zu verschachtelte Zeiger. ich will einfach nur einen zusammenhängenden block von memry.
  • Nach der Veröffentlichung meiner Antwort, ich hatte das "toldyou" Idee läuft in meinem Kopf herum. Ich kann mir einfach nicht vorstellen, wie dieses bisschen syntaktischer Zucker ist mehr Wert als alle Reifen müssen Sie springen durch, um es zu bekommen 😉
  • heh, ich glaube es nicht, aber ich wusste nicht, dass wenn ich zuerst gepostet diese Frage!
InformationsquelleAutor Claudiu | 2010-06-29
Schreibe einen Kommentar