@bizulk
Je t'ai conseillé d'initialiser ta mémoire ailleurs car tu retournes tab qui est une variable locale et tu dois avoir un warning la-dessus
Il n'est pas du tout déconseillé de retourner la valeur d'une variable locale (comme ici). C'est même le cas le plus fréquent. Par contre, il ne faut pas retourner l'adresse d'une variable locale.
if ((tab[ctr++] = get_next_line(0)) == NULL)
T'est sur de ce que tu fais là ? Que les habitués de la norme me corrigent mais d'après moi cela se passe dans cet ordre :
tab[ctr]= get_next_line(0))
ctr++
comparer tab[ctr] à NULL ce qui peut être le cas (car tu n'initialise pas tab). Mais ce qui n'est surement pas ce que tu souhaitais tester.
Non, cette expression n'est pas évaluée de cette façon : Il n'y a pas comparaison de tab[ctr] à NULL, mais comparaison à NULL de la valeur de l'expression
tab[ctr++] = get_next_line(0)
L'évaluation se fait de la façon suivante :
1- Evaluation de get_next_line(0) qui donne un valeur V (égale à la valeur retournée par la fonction)
2- Evaluation de l'adresse A correspondant à tab[ctr]
L'ordre des évaluations peut être 1 puis 2 ou 2 puis 1. Ce n'est pas spécifié.
3- Placement de la valeur V à l'adresse A (si besoin est, la valeur V est convertie au préalable en le type du contenu de A et prend la valeur V').
V (ou V') est la valeur de l'expression (celle qui sera comparée à NULL).
4- Incrément de ctr
L'ordre des évaluations peut être 3 puis 4 ou 4 puis 3. Ce n'est pas spécifié.
Partager