2010-12-29 6 views
0

I diese Variable deklariert haben:Mit sizeof für einen Zeiger auf einen Zeiger auf ein Feld von 2 schwimmt

float (**explosions)[4]; 

Diese auf einen Speicherblock von Zeigern auf Speicherblocks für Float Arrays mit 4 floats Punkt wird.

Wenn ich den Speicherblock von Zeigern auf Speicherblöcke von Float-Arrays mache, was stelle ich hier. Sollte ich nur ungültige Zeiger verwenden? Das wäre eine Option, aber keine schöne.

Wenn ich den Speicherblock für die Arrays erstelle ich denke, wenn gut?

explosions[explosion_number] = malloc(sizeof(float) * 64); 

Das ist 16 der Float-Arrays mit 4 Elementen zu machen. Der Grund, warum ich 16 dieser Arrays im Speicher haben muss, ist, dass ich redundanten Speicher entfernen kann, und so kann ich den Zeiger auf diese Arrays NULL machen, so dass ich weiß, wann die Arrays freigegeben werden, nachdem redundant und keine weitere Verarbeitung erforderlich ist. Nur für den Fall, dass Sie sich gefragt haben.

Vielen Dank für jede Hilfe.

Antwort

4

sizeof kann mit einem Typ in Klammern oder mit einem Ausdruck arbeiten. Wenn Sie sizeof <expression> tun, dann wird der Ausdruck nur auf seinen Typ überprüft, aber es wird nicht ausgewertet, so dass es keine Probleme mit der Dereferenzierung von Nullzeigern oder ähnlichem geben kann.

Das heißt, Sie die realloc und malloc Anrufe wie folgt schreiben können:

explosions = realloc(explosions, sizeof(*explosions) * explosion_number); 
explosions[explosion_number-1] = malloc(16 * sizeof(**explosions)); 
    // -1 because explosions array runs from 0 to (explosion_number-1) 
+0

Danke. Auch ja. Ich hätte Probleme ohne das Minus gehabt. –

+0

Ich könnte das auch immer für malloc verwenden. –

+0

@Matthew: Es ist ein gutes Idiom zu verwenden, wann immer Sie können. Es erspart Ihnen viele Kopfschmerzen, wenn Sie einen Typ ändern müssen. –