La ligne 79 pose problème: tu perds l'adresse retournée par le malloc() de la ligne 72. Tu dois utiliser strcpy(). Idem lignes 28 et 50.
Autre problème, et je m'arrêterai là: la variable rp que reçoivent fct1() et fct2() n'est qu'une copie de tab. Tu peux modifier rp autant que tu veux dans les fonctions, la variable tab du main() restera inchangée. Par contre, si tu passais l'adresse de tab aux fonctions
int fct(char ***rp,....) {
....
}
int main() {
char **tab;
....
int x=fct(&tab,....);
....
}
ça aiderait :-)
PS: en C, on ne cast pas le retour de malloc(). Si cela génère une erreur de compilation sans le cast, c'est que tu compiles en C++ et pas en C
La ligne 79 pose problème: tu perds l'adresse retournée par le malloc() de la ligne 72. Tu dois utiliser strcpy(). Idem lignes 28 et 50.
Autre problème, et je m'arreterai là: la variable rp que reçoivent fct1() et fct2() n'est qu'une copie de tab. Tu peux modifier rp autant que tu veux dans les fonction la variable tab du main() restera inchangée. Par contre, si tu passais l'adresse de tab aux fonctions
int fct(char ***tab,....) {
....
}
int main() {
char **tab;
....
int x=fct1(&tab,....);
....
}
ça aiderait :-)
PS: en C, on ne cast pas le retour de malloc(). Si cela génère une erreur de compilation, c'est que tu compiles en C++ et pas en C
- Edité par edgarjacobs il y a moins de 30s
Merci pour ton aide,
J'ai appliqué ce que tu m'as dit, mais hélas j'ai toujours la même erreur !
Je pense que je suis perdu dans ces histoires de pointeurs ....
Un exemple, en sachant que realloc() réagit comme malloc() lorsque le pointeur à réallouer est NULL. Ce code fait 5 réallocations de 3 éléments de ESIZE taille
Un exemple, en sachant que realloc() réagit comme malloc() lorsque le pointeur à réallouer est NULL. Ce code fait 5 réallocations de 3 éléments de ESIZE taille
Comme l'a écrit rouloude, j'envoie l'adresse du pointeur à la fonction de réallocation, ce qui permet de le modifier
-
Merci pour ton code !
Je me suis inspiré pour refaire mon code à moi , par contre j'ai une question :
Pour mon cas quand je free a la fin chaque ligne seule mon code crash, par contre quand je free direteent le tableau en entier ça marche ! je trouve ça bizzar.
Pour ton code, il ne manque pas un free(array) à la fin ?
Voici mon code :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <stdarg.h>
#include <inttypes.h>
#include <unistd.h>
#include <sys/time.h>
void fct1( char ***rp,int oldSize,int newSize)
{
for(int i=0; i<oldSize; i++)
{
printf(" \n Avant remplissage : rp[%d] = %s",i,(*rp)[i]);
}
printf("\n------------------------------------------------------\n");
*rp =realloc (*rp, newSize * sizeof(**rp) );
if (rp==NULL)
{
printf(" \n Allocation problem \n");
exit(0);
}
for(int i=0;i<newSize;i++)
{
(*rp)[i]=malloc(sizeof(char)*4);
}
for(int i=0; i<newSize; i++)
{
(*rp)[i]="111\0";
printf(" \n Apres remplissage : rp[%d] = %s",i,(*rp)[i]);
}
}
int main()
{
int oldSize=0;
char **tab=NULL;
tab=(char**)malloc(oldSize*sizeof(char*));
if(tab==NULL)
{
printf("Problème de Malloc tab \n");
exit(0);
}
else
{
for(int i=0;i<oldSize;i++)
{
tab[i]=(char*)malloc(sizeof(char)*4);
}
}
printf("Initialisation\n");
for(int i=0;i<oldSize;i++)
{
tab[i]="000\0";
}
printf("\n------------------------------------------------------\n");
printf(" \n\n \t\tAvant le passage par la fct1 : tab vaut \n");
for(int i=0; i<oldSize;i++)
{
printf(" \ntab[%d] = %s",i,tab[i]);
}
int newSize=5;
fct1(&tab,oldSize,newSize);
printf("\n------------------------------------------------------\n");
printf(" \n\n \t\tApres le 1 er passage par la fct : tab vaut \n");
for(int i=0; i<newSize;i++)
{
printf(" \ntab[%d] = %s",i,tab[i]);
}
oldSize=newSize;
newSize=10;
fct1(&tab,oldSize,newSize);
printf("\n------------------------------------------------------\n");
printf(" \n\n \t\tApres le 1 er passage par la fct : tab vaut \n");
for(int i=0; i<newSize;i++)
{
printf(" \ntab[%d] = %s",i,tab[i]);
}
/* for( int i=0; i<newSize; i++)
{
free((*tab)[i]);
}*/
free(tab);
printf("\n fin du code");
return 0;
}
Le cours de Zeste de Savoir est très bon: https://zestedesavoir.com/tutoriels/755/le-langage-c-1/1043_aggregats-memoire-et-fichiers/4277_les-pointeurs/
Le Tout est souvent plus grand que la somme de ses parties.
Le cours de Zeste de Savoir est très bon: https://zestedesavoir.com/tutoriels/755/le-langage-c-1/1043_aggregats-memoire-et-fichiers/4277_les-pointeurs/
Merci !
Allocation dynamique Tableau de charactères
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Le Tout est souvent plus grand que la somme de ses parties.