Rechercher : dans
Par :

Pointeur de pointeurs en C

Dernière réponse le 9 nov 2007 à 07:38:59 tafiscobar, le 8 fév 2003 à 14:16:21 
 Signaler ce message aux modérateurs

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

Meilleures réponses pour « pointeur de pointeurs en C » dans :

1

marvinrouge, le 8 fév 2003 à 16:10:25
  • +1

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;
}

Répondre à marvinrouge

2

marvinrouge, le 8 fév 2003 à 16:20:11

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;

Répondre à marvinrouge

3

tafiscobar, le 9 fév 2003 à 17:57:33

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

Répondre à tafiscobar

4

marvinrouge, le 10 fév 2003 à 08:37:38

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

Répondre à marvinrouge

5

habibsiby, le 9 nov 2007 à 02:38:24

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 *

Répondre à habibsiby

6

 lami20j, le 9 nov 2007 à 07:38:59

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
lami20j

Répondre à lami20j