Segmentation sur vprintf.c

Je suis étudiant en deuxième année et je ne suis pas aussi compétent en programmation que j’aimerais le faire. Nous travaillons avec OS161 en C cette année.

Pour le problème, je suis censé écrire un programme C qui peut prendre des commandes comme des arguments et les renvoyer. Ok, pas de problème. Je l’ai déjà fait dans d’autres langues. Voici le code que j’ai essayé:

#include  int main (int argc, char *argv[]) { int i = 0; printf("\ncmdline args count=%s", argc); /* First argument is executable name only */ printf("\nexe name=%s", argv[0]); for (i=1; i< argc; i++) { printf("\narg%d=%s", i, argv[i]); } printf("\n"); return 0; } 

Cela comstack très bien avec gcc, mais quand je l’exécute, j’obtiens l’erreur de segmentation. Je le lance avec gdb, et c’est ce que je reçois:

 Program received signal SIGSEGV, Segmentation fault. 0x00007ffff7abc493 in _IO_vfprintf_internal (s=0x7ffff7dd97a0, format=, ap=0x7fffffffe3f0) at vfprintf.c:1623 1623 vfprintf.c: No such file or directory. in vfprintf.c 

Lorsque je commente les instructions printf, elles s’exécutent, mais évidemment, elles ne feront pas ce dont j’ai besoin. Pour autant que je sache, ce sont les déclarations printf qui posent problème, mais pourquoi? Je l’ai regardé et j’ai inclus le bon en-tête. Il est difficile pour moi d’imaginer qu’il y a vraiment quelque chose qui ne va pas avec vfprintf.c, puisque tout cela se passe sur la machine virtuelle de mon école dans laquelle je travaille. Si quelqu’un pouvait me jeter un os, je l’apprécierais vraiment. Merci!

Edit, comme vous pouvez le voir, j’ai le mauvais spécificateur de conversion. C’était tout le problème.

argc est un entier, mais vous avez dit à printf d’utiliser le format %s .

 printf("\ncmdline args count=%s", argc); 

Comme vous avez utilisé %s , printf considère la valeur de argc comme une adresse mémoire à partir de laquelle il essaie d’extraire les caractères de la chaîne, ce qui a entraîné une erreur de segmentation.

Changez le format en %d :

 printf("\ncmdline args count=%d", argc);