La concaténation de ssortingng et int aboutit à une erreur de segmentation en C

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; } 

Problème avec votre chaîne de format:

 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.

Problème avec votre gestion de mémoire:

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.