Forum Programmation.c Segmentation fault!

Posté par  .
Étiquettes : aucune
0
3
déc.
2005
Bonjour à tous,

J'ai un problème de segmentation dans le code qui suit mais je ne vois vraiment pas pourquoi?


#define NB_ELEM 300

typedef int Tab[NB_ELEM];

void init_tab(Tab *local_tab)
{
int i;
for(i=0;i<NB_ELEM;i++)
*local_tab[i]=1;
}

void main(void)
{
Tab tableau;
init_tab(&tableau);
}


Si quelqu'un à la moindre idée d'ou ça peu provenir, je suis preneur. Merci.
  • # Priorite :

    Posté par  . Évalué à 1.

    Je suis pas sur mais je testerai bien :
    (*local_tab)[i]=1;


    Sinon dans ce cas je ne vois pas trop l interet de passer par un pointeur sur tableau...
    • [^] # Re: Priorite :

      Posté par  . Évalué à 1.

      Yes, ça marche! Merci beaucoup tuxyl :D

      en effet:
      *local_tab[i]=1; est différent de (*local_tab)[i]=1;

      L'interet de passer par un pointeur de tableau est que dans mon code d'origine j'utilise des tableaux à 4 dimentions, et je manipule ça comme un simple type Tab. C'est juste une question de clarté de code.
  • # typedef

    Posté par  . Évalué à 1.

    Ton typedef me semble bizarre
    je ne suis pas sur qu'il alloue vraiment 300 int dans un Tab
    • [^] # Re: typedef

      Posté par  . Évalué à 1.

      Le typedef n'alloue rien du tout, effectivement ; mais l'instruction

      > Tab tableau;

      (dans le main), oui. Elle est équivalente à

      > int tableau[300];
      • [^] # Re: typedef

        Posté par  . Évalué à 0.

        merci pour la precision
        je savais que le typedef n'allouerai rien, mais je ne savais pas si cela serait effectivement equivalent au int[300] dans le main
  • # Ca ne compile pas chez moi (tm)

    Posté par  . Évalué à 1.

    void main(void)
    main() doit renvoyer un int.
    Et, comme main() est censée renvoyer un int, on ajoute
    return 0;
    à la fin de main()pour signaler à l'OS qu'il n'y a pas de problème. Ou alors
    return EXIT_SUCCESS;
    qui a la même sémantique (et la même portabilité), mais qui a le mérite d'être plus explicite pour le relecteur (il faut un incldue standard, stdlib.h, je crois).

    Il faut régler son compilateur pour être sûr qu'on fait du vrai C. Avec gcc:
    gcc -Wall -Wextra -std=c99
    est un bon début (ou remplace c99 par c90 ou ce que tu veux, suivant tes besoins). L'option -pedantic est aussi très utile, car rajoute tous les warnings que la norme définit. Voir la doc de gcc pour plus d'infos.

    Sinon, passer l'adresse de ton Tab plutôt que Tab est inutile (passer Tab revient à donner un pointeur vers le premier élément de ton tableau, quelles que soient ses dimensions). Mais, si on sait ce qu'on fait (on passe un pointeur vers un tableau, et non un pointeur vers un élément de tableau), alors il n'y a pas de problème ;)

    PS:
    There are 2 rules of precedence. Multiply before you add and use parentheses everywhere else.


    PPS: POSIX spécifie en plus que EXIT_SUCCESS vaut 0, mais en-dehors de POSIX la valeur de la macro peut être quelconque (mais différente de EXIT_FAILURE, évidemment).

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.