Pointeur de pointeurs en C

tafiscobar Messages postés 1281 Statut Contributeur -  
lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   -
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

  1. marvinrouge
     
    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
    1. marvinrouge
       
      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
  2. tafiscobar Messages postés 1281 Statut Contributeur 177
     
    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
  3. marvinrouge
     
    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
  4. habibsiby
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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