Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

bug dans un petit programme

5 réponses
Avatar
Thierry B
Bonjour,

Je voulais vous poser une petite question.

Voici un tout petit programme C:

#define _POSIX_SOURCE 1
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
int arg;
char *buf;
printf("Nombre d'argument: %d\n",argc);
arg =3D atoi(argv[1]);
if (arg < 5) {
sprintf(buf, "%d", arg);
printf("Le nombre est %s.\n",buf);
}
return 0;
}

Quand je le lance, il me met ca:

thierry@debian:~/Master/Posix/Supplement_Semaine2$ ./bin/exo3 2
Nombre d'argument: 2
Le nombre est 2.
3599:
3599: calling fini: /lib/tls/libc.so.6 [0]
3599:

Il m'affiche bien le r=E9sultat, mais il met aussi des lignes bizarres,
mais quand je remplace sprintf(buf, "%d", arg) par sprintf(buf, " %d",
arg) cad en ajoutant juste un espace entre le " et %d, ca marche nikel.

Quelqu'un a une id=E9e?

Merci
A+

5 réponses

Avatar
Eric Levenez
Le 16/10/05 12:01, dans
, « Thierry B »
a écrit :

Bonjour,

Je voulais vous poser une petite question.

Voici un tout petit programme C:

#define _POSIX_SOURCE 1


Pourquoi ce define ?

#include <stdio.h>
#include <stdlib.h>

#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>


Pourquoi ces 3 includes ?

int main(int argc, char *argv[]) {
int arg;
char *buf;


warning: 'buf' is used uninitialized in this function

printf("Nombre d'argument: %dn",argc);
arg = atoi(argv[1]);


argv[1] n'existe pas forcément

if (arg < 5) {
sprintf(buf, "%d", arg);


sprintf écrit des données dans un buffer non alloué.

printf("Le nombre est %s.n",buf);
}
return 0;
}

Quand je le lance, il me met ca:

:~/Master/Posix/Supplement_Semaine2$ ./bin/exo3 2
Nombre d'argument: 2
Le nombre est 2.
3599:
3599: calling fini: /lib/tls/libc.so.6 [0]
3599:

Il m'affiche bien le résultat, mais il met aussi des lignes bizarres,
mais quand je remplace sprintf(buf, "%d", arg) par sprintf(buf, " %d",
arg) cad en ajoutant juste un espace entre le " et %d, ca marche nikel.

Quelqu'un a une idée?


Il faut allouer la place de buf.
Il faut tester le nombre d'arguments au programme.

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
int arg;
char buf[42];

(void)printf("Nombre d'argument: %dn", argc);
if (argc > 1) {
arg = atoi(argv[1]);
if (arg < 5) {
(void)sprintf(buf, "%d", arg);
(void)printf("Le nombre est %s.n", buf);
}
}
return 0;
}


--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.

Avatar
Thierry B
Ha oki.
Quand on declare un pointeur vers un char au lieu d'un tableau, on est
forcé de faire nous même le malloc donc (qui appremment n'est pas
nécessaire quand on declare un tableau), et ensuite de faire un free
en fin de programme sur le char* ?

Merci :-)
A+
Avatar
Eric Levenez
Le 16/10/05 13:23, dans
, « Thierry B »
a écrit :

Quand on declare un pointeur vers un char au lieu d'un tableau, on est
forcé de faire nous même le malloc donc (qui appremment n'est pas
nécessaire quand on declare un tableau), et ensuite de faire un free
en fin de programme sur le char* ?


Oui, soit on utilise un tableau préalloué, soit on fait l'allocation à la
main par malloc et on n'oublie pas de libérer par free.

--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.

Avatar
Thierry B
Avatar
Emmanuel Delahaye
Quand on declare un pointeur vers un char au lieu d'un tableau, on est


définit...

http://mapage.noos.fr/emdel/notes.htm#definitions

forcé de faire nous même le malloc donc (qui appremment n'est pas
nécessaire quand on declare un tableau), et ensuite de faire un free
en fin de programme sur le char* ?


C'est une solution. On peut aussi l'initialiser avec l'adresse du
premier élément d'un tableau valide.

char s[] = "Hello world";
char *p = s;

D'une façon générale, un pointeur n'est qu'une variable comme une autre.
Avant de l'utiliser, il faut qu'elle ait été initialisée correctement.

http://mapage.noos.fr/emdel/notes.htm#pointeurs

--
C is a sharp tool