Je ne suis pas sûr de ce que je fais mal. J’essaie de concaténer hostname
avec pid
pour créer un id
.
char *generate_id(void) { int ret; char id[1048]; char hostname[1024]; pid_t pid = getpid(); //hostname[1023] = '\0'; if ((ret = gethostname(hostname,1024) < 0)) { perror("gethostname"); exit(EXIT_FAILURE); } sprintf(id, "%s%d", pid); printf("hostname is %s\n", hostname); printf("The process id is %d\n", pid); printf("The unique id is %s", id); return id; }
MODIFIER:
Code mis à jour après avoir lu certaines réponses:
char *generate_id(void) { int ret; char hostname[1024]; pid_t pid = getpid(); //hostname[1023] = '\0'; if ((ret = gethostname(hostname,1024) < 0)) { perror("gethostname"); exit(EXIT_FAILURE); } int size = snprintf(NULL, 0, "%s%d", hostname, pid); char * id = malloc(size + 1); printf("hostname is %s\n", hostname); printf("The process id is %d\n", pid); printf("The unique id is %s\n", id); return id; }
MODIFIER:
Code de travail:
char *generate_id(void) { int ret; char hostname[1024]; pid_t pid = getpid(); //hostname[1023] = '\0'; if ((ret = gethostname(hostname,1024) < 0)) { perror("gethostname"); exit(EXIT_FAILURE); } int size = snprintf(NULL, 0, "%s%d", hostname, pid); char * id = malloc(size + 1); sprintf(id, "%s%d", hostname, pid); printf("hostname is %s\n", hostname); printf("The process id is %d\n", pid); printf("The unique id is %s\n", id); return id; }
sprintf(id, "%s%d", pid);
Votre chaîne de format a deux formateurs ( %s
pour une chaîne et %d
pour un int
), mais vous ne transmettez qu’un pid_t
. Vous voulez probablement dire:
sprintf(id, "%s%d", hostname, pid);
ou
sprintf(id, "%d", pid);
Dans votre code, le %s
interprète le pid
comme un pointeur. Essayer de déréférencer que formater la chaîne provoque l’erreur de segmentation car il s’agit d’une valeur de pointeur non valide.
Mais il y a aussi un comportement indéfini dans votre code: vous déclarez que id
est un tableau alloué par stack, mais vous renvoyez ce tableau (qui se décompose en un pointeur ici). Ceci est également faux et peut conduire à un crash plus tard.
Vous devez changer id
en un tableau alloué par tas, comme ceci:
char * id = malloc(1024);
L’appelant de votre fonction generate_id
doit ensuite free
la mémoire une fois l’opération terminée.
C’est probablement une bonne idée de n’allouer que l’espace dont vous avez besoin. Vous pouvez utiliser snprintf
pour cela comme ceci:
// Determine how much space the ssortingng needs. int size = snprintf(NULL, 0, "%d", pid); // Allocate the required space plus NULL termination. char * id = malloc(size + 1); // Actually print the ssortingng. sprintf(id, "%d", pid);
Vous ne savez pas trop où vous vous trouvez mais vous avez quelques problèmes.
snprintf () est beaucoup plus sûr et ne surchargera pas le tampon id []. sprintf pourrait saturer le tampon
sprintf (id, “% s% d”, pid) est mauvais comme mentionné ci-dessus.
return id est incorrect car il renvoie le pointeur sur une valeur de la stack. Dès votre retour, la stack ne vous appartient plus.
sprintf(id, "%s%d", pid);
Vous avez deux sélecteurs% s et% d, mais un seul paramètre (pid). Vous devez insérer une chaîne et un entier au lieu de l’entier.