Comme beaucoup de jeunes programmeurs, j'ai appris l'utilité d'insérer de nombreuses instructions d'impression-console de "here1", "here2", et ainsi de suite à différents points du code pour comprendre quand mes programmes vont mal. Cette technique de débogage de force brute m'a sauvé beaucoup, plusieurs fois tout au long de mes études CS. Cependant, quand j'ai commencé à programmer en C, je suis tombé sur un problème intéressant. Si je devais essayer de courirC Programmation: erreurs de segmentation, printf et dépendances
void* test;
printf("hello world");
test[5] = 234;
Bien sûr, je reçois une erreur de segmentation pour ne pas malloc'ing mémoire pour testChar. Cependant, vous penseriez logiquement que "bonjour monde" serait imprimé avant que la faute seg, car c'est le flux du code, mais dans mon expérience, il est toujours le cas que la faute seg se produit d'abord, et "salut monde "n'est jamais imprimé sur la console. (Je n'ai pas pu tester cet exemple exact, mais j'ai souvent rencontré ce genre de situation en utilisant gcc sur une machine linux.) Je suppose que cela a à voir avec le fait que le compilateur réorganise certaines choses et/ou printf en utilisant une sorte de tampon qui est vidé de façon asynchrone et qui n'est donc pas immédiat. C'est tout à fait de la spéculation de ma part parce que je ne sais vraiment pas pourquoi cela arrive. Dans toute autre langue que j'ai utilisée, quel que soit le problème causé par la ligne "testChar = ...", le "hello world" serait toujours imprimé, et ainsi je pourrais déterminer où est le problème.
Ma question est la suivante: pourquoi cela se produit-il lorsque je programme C? Pourquoi le monde des salutations n'est-il pas imprimé en premier? Et deuxièmement, y at-il une meilleure technique de débogage de programmation C que celle qui accomplit la même chose de base? Comme dans, un moyen facile/intuitif de trouver la ligne de code qui pose problème?
Editer: J'ai donné un exemple de travail par accident haha. Ce que j'ai maintenant devrait provoquer une erreur de segmentation. C'est drôle comment d'habitude quand je ne veux pas un je veux en obtenir un, et maintenant quand j'en ai voulu un, j'ai écrit du code légal!
Je pensais ça.* gratte la tête * bien que je devienne mental. –
Désolé pour ce lol, j'ai corrigé mon code pour que ce soit un vrai problème. J'avais besoin de quoi que ce soit qui causerait une erreur de segmentation. – JoeCool
"oh merde c'est mauvais" sera stocké dans la zone des symboles (?) Et le pointeur est stocké dans testChar ... vous pouvez le voir avec le débogueur. – stefanB