OVH Cloud OVH Cloud

PB -> Allocation memoire

4 réponses
Avatar
David Roman CESR
Le but du jeu est d'avoir un tableau de pointers vers des pointers de
tableaux de integer

[0] -> [0][1][2]
[1] -> [0][1]
[2] -> [0][1][2][3][4]

mais ce tableau, je veux pouvoir l'augmenter en fonction des besoins

[0] -> [0][1][2][3] <- Ajout
[1] -> [0][1]
[2] -> [0][1][2][3][4]
[3] -> [0] <- Ajout
[4] -> [0][1] <- Ajout
[5] -> [0] <- Ajout

La reallocation de memoire ce fait dans une fonction (pour l'exemple
f1(uint **TRec))

Dans mon exemple, si je place le code de la fonction dans le main, pas
de probleme ca semble marche.
Mais quand j'utilise la fonction ca merde complet ...
Alors soit je n'utilise pas malloc() et realloc() correctement, soit
j'ai un probleme dans le passage de TRec.

Si vous pouvez m'aider ... svp ... ca serai sympas ... merci
Voila mon code exemple pour illustrer mon souci

#include <stdio.h>
#include <malloc.h>


void f1(uint **TRec)
{
int i;

TRec=(uint **) realloc(TRec,4*sizeof(uint));
if (TRec==NULL) {
printf("Erreur d'allocation mémoire CheAAAckDouble !!!");
exit(1);
}

for (i=2;i<4;i++) {
TRec[i]=(uint *) malloc(2*sizeof(uint));
if (TRec[i]==NULL) {
printf("Erreur d'allocation mémoire CheckDouble !!!");
exit(1);
}
TRec[i][0]=i;
TRec[i][1]=i+1;
}
}


void main(void)
{

uint **TRec;
int i;


TRec=(uint **) malloc(2*sizeof(uint));
if (TRec==NULL) {
printf("Erreur d'allocation mémoire CheckDouble !!!");
exit(1);
}

for (i=0;i<2;i++) {
TRec[i]=(uint *) malloc(2*sizeof(uint));
if (TRec[i]==NULL) {
printf("Erreur d'allocation mémoire CheckDouble !!!");
exit(1);
}
TRec[i][0]=i;
TRec[i][1]=i+1;
}

for (i=0;i<2;i++) {
printf("%i %i\n",TRec[i][0],TRec[i][1]);
}

printf("\n\n");


f1(TRec);

for (i=0;i<4;i++) {
printf("%i %i\n",TRec[i][0],TRec[i][1]);
}


for (i=0;i<4;i++) {
TRec[i]=(uint *) realloc(TRec[i],3*sizeof(uint));
TRec[i][2]=i;
}

printf("\n\n");
for (i=0;i<4;i++) {
printf("%i %i %i\n",TRec[i][0],TRec[i][1],TRec[i][2]);
}


}

4 réponses

Avatar
Yves ROMAN

Le but du jeu est d'avoir un tableau de pointers vers des pointers de
tableaux de integer

[0] -> [0][1][2]
[1] -> [0][1]
[2] -> [0][1][2][3][4]

mais ce tableau, je veux pouvoir l'augmenter en fonction des besoins

[0] -> [0][1][2][3] <- Ajout
[1] -> [0][1]
[2] -> [0][1][2][3][4]
[3] -> [0] <- Ajout
[4] -> [0][1] <- Ajout
[5] -> [0] <- Ajout

La reallocation de memoire ce fait dans une fonction (pour l'exemple
f1(uint **TRec))

Dans mon exemple, si je place le code de la fonction dans le main, pas
de probleme ca semble marche.
Mais quand j'utilise la fonction ca merde complet ...
Alors soit je n'utilise pas malloc() et realloc() correctement, soit
j'ai un probleme dans le passage de TRec.

Si vous pouvez m'aider ... svp ... ca serai sympas ... merci
Voila mon code exemple pour illustrer mon souci

#include <stdio.h>
#include <malloc.h>

void f1(uint **TRec)
{
int i;

TRec=(uint **) realloc(TRec,4*sizeof(uint));


en fait tu dois allouer la place pour des uint *
TRec=realloc(TRec,4*sizeof(*TRec));

if (TRec==NULL) {
printf("Erreur d'allocation mémoire CheAAAckDouble !!!");
exit(1);
}

for (i=2;i<4;i++) {
TRec[i]=(uint *) malloc(2*sizeof(uint));
if (TRec[i]==NULL) {
printf("Erreur d'allocation mémoire CheckDouble !!!");
exit(1);
}
TRec[i][0]=i;
TRec[i][1]=i+1;
}
}



Si tu veux modifier le contenu d'un pointeur dans une fonction (typiquement par
realloc()), tu dois le passer par adresse pour que cette modification soit
visible par l'appelant. SInon, l'appelant continue à travailer avec l'adresse
avant realloc().

void f1(uint ***TRec)
{
int i;

*TRec=realloc(*TRec,4*sizeof(**TRec));
Puis dans la suite de la fonction utiliser *TRec au lieu de TRec

void main(void)
{

uint **TRec;
int i;

TRec=(uint **) malloc(2*sizeof(uint));


Allouer la place pour des uint * et non des uint

if (TRec==NULL) {
printf("Erreur d'allocation mémoire CheckDouble !!!");
exit(1);
}

for (i=0;i<2;i++) {
TRec[i]=(uint *) malloc(2*sizeof(uint));
if (TRec[i]==NULL) {
printf("Erreur d'allocation mémoire CheckDouble !!!");
exit(1);
}
TRec[i][0]=i;
TRec[i][1]=i+1;
}

for (i=0;i<2;i++) {
printf("%i %in",TRec[i][0],TRec[i][1]);
}

printf("nn");

f1(TRec);


Ici passer l'adresse
f1(&TRec);


for (i=0;i<4;i++) {
printf("%i %in",TRec[i][0],TRec[i][1]);
}

for (i=0;i<4;i++) {
TRec[i]=(uint *) realloc(TRec[i],3*sizeof(uint));
TRec[i][2]=i;
}

printf("nn");
for (i=0;i<4;i++) {
printf("%i %i %in",TRec[i][0],TRec[i][1],TRec[i][2]);
}

}


Avatar
David Roman CESR
J'ai suivi tes instructions, mais j'ai du oublier quelque chose ...
Voila mon code modifie

J'ai un Segmentation Fault(coredump) au moment de l'affectation
*TRec[i][0]=i;




#include <stdio.h>
#include <malloc.h>


void f1(uint ***TRec)
{
int i;

//*TRec=realloc(*TRec,4*sizeof(**TRec));
*TRec=realloc(*TRec,4*sizeof(uint *));
<===================================================== LA

if (*TRec==NULL) { <===================================================== LA
printf("Erreur d'allocation mémoire CheAAAckDouble !!!");
exit(1);
}

for (i=2;i<4;i++) {
*TRec[i]=malloc(2*sizeof(uint));
<===================================================== LA
if (*TRec[i]==NULL) { <===================================================== LA
printf("Erreur d'allocation mémoire CheckDouble !!!");
exit(1);
}
*TRec[i][0]=i; <===================================================== LA
(1)
*TRec[i][1]=i+1; <===================================================== LA (2)
}
}


void main(void)
{

uint **TRec;
int i;


TRec=(uint **) malloc(2*sizeof(uint *));
<===================================================== LA
if (TRec==NULL) {
printf("Erreur d'allocation mémoire CheckDouble !!!");
exit(1);
}

for (i=0;i<2;i++) {
TRec[i]=(uint *) malloc(2*sizeof(uint));
if (TRec[i]==NULL) {
printf("Erreur d'allocation mémoire CheckDouble !!!");
exit(1);
}
TRec[i][0]=i;
TRec[i][1]=i+1;
}

for (i=0;i<2;i++) {
printf("%i %in",TRec[i][0],TRec[i][1]);
}

printf("nn");


f1(&TRec); <===================================================== LA

for (i=0;i<4;i++) {
printf("%i %in",TRec[i][0],TRec[i][1]);
}


for (i=0;i<4;i++) {
TRec[i]=(uint *) realloc(TRec[i],3*sizeof(uint));
TRec[i][2]=i;
}

printf("nn");
for (i=0;i<4;i++) {
printf("%i %i %in",TRec[i][0],TRec[i][1],TRec[i][2]);
}
}
Avatar
Yves ROMAN

J'ai suivi tes instructions, mais j'ai du oublier quelque chose ...
Voila mon code modifie

J'ai un Segmentation Fault(coredump) au moment de l'affectation
*TRec[i][0]=i;

#include <stdio.h>
#include <malloc.h>

void f1(uint ***TRec)
{
int i;

//*TRec=realloc(*TRec,4*sizeof(**TRec));
*TRec=realloc(*TRec,4*sizeof(uint *));
<===================================================== LA

if (*TRec==NULL) { <===================================================== LA
printf("Erreur d'allocation mémoire CheAAAckDouble !!!");
exit(1);
}

for (i=2;i<4;i++) {
*TRec[i]=malloc(2*sizeof(uint));


Je ne me souviens jamais des priorités des opérateurs * et [].
Dans le doute rajoutes des parenthèses
(*TRec)[i]
au cas ou il ferait *(TRec[i]) qui va pointer au mauvais endroit si i != 0
Idem dans tout ce qui suit

[...]

Avatar
David Roman CESR
MERCI ca marche pile poil
La tu viens de me sortir une belle epine du pied
j'aurais jamais trouve ....



MERCI