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 tuxyl . Évalué à 1.
(*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 pierrex . Évalué à 1.
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 lukeg . Évalué à 1.
je ne suis pas sur qu'il alloue vraiment 300 int dans un Tab
[^] # Re: typedef
Posté par tontonflingueur . Évalué à 1.
> Tab tableau;
(dans le main), oui. Elle est équivalente à
> int tableau[300];
[^] # Re: typedef
Posté par lukeg . Évalué à 0.
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 alf . Évalué à 1.
Et, comme main() est censée renvoyer un int, on ajoute à la fin de main()pour signaler à l'OS qu'il n'y a pas de problème. Ou alors 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: 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:
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.