Pointeur de pointeurs en C

Fermé
tafiscobar Messages postés 1277 Date d'inscription jeudi 7 décembre 2000 Statut Contributeur Dernière intervention 26 février 2009 - 8 févr. 2003 à 14:16
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 9 nov. 2007 à 07:38
bonjour, j'espere q quelqu'un pourra m'aider, je n comprend pas pourqoi j'ai toujours Segmentation fault a l'execution,voici le code,il est simple, j'omets ici les includes
int main(int argc, char* argv[]) {
int i=0; char **str;
str=malloc(30*3*sizeof(char));
//initialisations manuelle
for(;i<3;i++)
strcpy(str[i],argv[i]); //ici erreur d'execution.
//essai d'affichage
for(i=0;i<3;i++)
printf("%s",str[i]);

return 1;
}

//j'espere q quelqu'un pourra m'aider,et please pas de vecteurs de pointeurs, mon bleme c'est d'utiliser les pointeurs de pointeurs.
tafiscobar

5 réponses

voici ton code corrigé

int main(int argc, char* argv[]) {
int i=0;
char **str;
str=(char**)malloc(30*3*sizeof(char*)); // il vaut mieux 'caster' en char**, le type de str, car malloc rend un void*
// et c'était sizeof(char*) puisque str est de tpye char**, pour le sizeof tu recopies le type avec une '*' en moins.

//initialisations manuelle
for(;i<3;i++)
{
// ATTENTION str est bien alloué ci-dessus mais tu oubliai que tu DOIS allouer CHACUN des str[i]
str[i] = (char*)malloc((strlen(argv[i])+1)*sizeof(char);
strcpy(str[i],argv[i]); //normalement l'erreur est corrigée
//essai d'affichage
}
for(i=0;i<3;i++)
printf("%s",str[i]);
return 1;
}
6
Encore moi,

j'ai juste oublié de préciser qu'il faut libérer la mémoire AVANT la fin du programme
les str[i] d'abord, str ensuite

for(i=0;i<3;i++)
{
free(str[i]);
str[i] = NULL;
}

free(str);
str = NULL;
0
tafiscobar Messages postés 1277 Date d'inscription jeudi 7 décembre 2000 Statut Contributeur Dernière intervention 26 février 2009 177
9 févr. 2003 à 17:57
merci marvinrouge.
au fait, lorsq je faisais ceci: str=malloc(30*3*sizeof(char));,je pensais que c'etait possible de lui demander d'allouer directement un tableau(taille=3) de pointeurs sur char (de taille 30),mais bon cela m'apprendra a essayer de trouver plus simple que le simple.
tafiscobar
0
en fait tu peux allouer soit des tableaux de tableaux (char**, ce qui ressemble à un 'peigne' dans el monde réel)c'est le plus clazssqiue et les redimensionnements dynamiques sont pas tout simples MAIS sont rapides à l'éxécution

soit un long tableau contigu (char*) ou tu mettras toutes tes chaines à la suite les unes des autres mais c'est très dangereux à gérer (dépassement de mémoire, oubli du '\0')
de plus c'est dur à redimmensionner dynamiquemeent
0
Bonjour,
si vous pouvez m'aidez sur les pointeurs je les saisie pas bien
par exemple si on dit
int fontion(int*)
je cmprends pas cette indice *
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
9 nov. 2007 à 07:38
Salut,

ça veut dire que la fonction prendre en argument un pointeur sur un entier
on pouvait écrire
int fonction(int *nombre)
pour être plus explicite
0