2010-12-29 5 views
0

J'ai déclaré cette variable:En utilisant sizeof pour un pointeur vers un pointeur sur un tableau de 2 flotteurs

float (**explosions)[4]; 

Il pointera vers un bloc de mémoire de pointeurs vers des blocs de mémoire pour les tableaux de flotteur avec 4 flotteurs.

Lors de la création du bloc de mémoire de pointeurs sur des blocs de mémoire de matrices flottantes, que dois-je mettre ici? Dois-je utiliser des pointeurs vides? Ce serait une option mais pas une belle. Lors de la création du bloc de mémoire pour les tableaux, je suppose que c'est bien?

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

Cela revient à faire 16 des tableaux flottants avec 4 éléments. La raison pour laquelle j'ai besoin de 16 de ces tableaux en mémoire est que je peux supprimer la mémoire redondante et ainsi faire le pointeur vers ces tableaux NULL pour savoir quand les tableaux sont libérés après avoir été redondants et qu'aucun traitement n'est nécessaire. Juste au cas où vous vous demanderiez.

Nous vous remercions de votre aide.

Répondre

4

sizeof peut fonctionner avec un type entre parenthèses ou avec une expression. Lorsque vous faites sizeof <expression>, alors l'expression n'est vérifiée que pour son type mais elle n'est pas évaluée, donc il ne peut y avoir aucun problème avec les pointeurs NULL de déréférencement ou similaire.

Cela signifie que vous pouvez écrire les realloc et malloc appels comme celui-ci:

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

Merci. Aussi, oui. J'aurais eu des problèmes sans le moins. –

+0

Je pourrais aussi bien l'utiliser toujours pour malloc réellement. –

+0

@Matthew: C'est un bon idiome à utiliser quand vous le pouvez. Il vous évite beaucoup de maux de tête lorsque vous devez changer un type. –

Questions connexes