Pointeur de pointeur

Fermé
rer_moh - 25 août 2008 à 17:31
 rer_moh - 25 août 2008 à 21:58
Bonjour,
Qui peux m’aider
Je ne comprends pas pourquoi cela ne marche pas
Voila le bout de programme simplifié, je complète le tableau avec une série de chiffre (juste pour l'exemple).
Apparemment le probleme viendrai du Data++ ??????????
Merci pour votre réponse

u_int16 **Data;
u_int16 x,y;
// Dimension X
x = 5;
Data = (u_int16**) malloc (x * sizeof(u_int16*));

// Dimension Y
y = 3;
for (i=0;i<x;i++)
Data[i] = (u_int16*) malloc(y * sizeof(u_int16));


for (i=0;i<x;i++)
{
for (j=0;j<y; j++)
*Data[j] = j+10*(x+i);

Data++;
}
free (Data);

2 réponses

Oui vous avez tout a fait raison pour la liberation de la memoire allouée.
il faut une boucle pour liberer les Data[i];
J'ai trouver pour l'incrementation il faut mettre à la place de Data++ ---> Data[i]++
Mais je n'arrive pas toujours a comprendre le Data[i]++ !!!!!
Data[i] je comprends , cela veut dire prendre le contenu à l'indexe i, qui correspond a une adresse
mais le ++ ???
A mois que cela consiste a incrementer l'adressse du pointeur Data et d'en prendre le contenu ???
j'ai essayer une autre syntaxe et cela marche *(Data)++;
Pouvez vous me dire pourquoi que cela marche ???
Vous en remerciant
0
Mahmah Messages postés 496 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 22 juin 2010 125
25 août 2008 à 20:37
Bonjour,

Il y a quelques petites choses maladroites.

Il doit toujours y avoir une correspondance un malloc = 1 free. il faut donc aussi une boucle pour faire des free puis seulement le free(Data);

Le Data++ est gênant car le free ne reçoit plus la bonne adresse, celle donnée par le malloc.

La boucle est très difficile à comprendre et je pense qu'elle dépasse les limites du tableau.

Après le premier tour:

Data = 
{
50, ??, ??,
51, ??, ??,
52, ??, ??,
??, ??, ??,
??, ??, ??,
}


Après le deuxième:

Data = 
{
50, ??, ??
60, ??, ??,
61, ??, ??,
62, ??, ??,
??, ??, ??
}


Après le cinquième

Data = 
{
50, ??, ??,
60, ??, ??,
70, ??, ??,
80, ??, ??,
90, ??, ??
}
91, ??, ??,    // dépassement
92, ??, ??


Je pense qu'il serait mieux de ré-écrire la double boucle en utilisant la notation Data[i][j] = ...
(Ou Data[j][0] qui reprend ton cas)

Quel est le résultat voulu ?

M.

EDIT. Les ?? représentent des données jamais écrites donc à supposer inconnues.
-1