usar - Concatenación de cadena e int resulta en falla de segmentación en C
leer cadena de caracteres en c (3)
Emita con su cadena de formato:
sprintf(id, "%s%d", pid);
Su cadena de formato tiene dos formateadores ( %s
para una cadena y %d
para una int
), pero solo pasa un pid_t
. Probablemente significa:
sprintf(id, "%s%d", hostname, pid);
o
sprintf(id, "%d", pid);
En su código, %s
interpreta el pid
como un puntero. Intentar desreferenciar eso para formatear la cadena provoca el error de segmentación ya que es un valor de puntero no válido.
Problema con su gestión de memoria:
Pero también hay un comportamiento indefinido en tu código: declaras que id
es una matriz asignada por la pila, pero estás devolviendo esa matriz (que se descompone en un puntero aquí). Esto también es incorrecto y puede provocar un bloqueo más adelante.
Debe cambiar el id
a una matriz asignada en el montón como esta:
char * id = malloc(1024);
El llamante de tu función generate_id
necesita free
la memoria cuando haya terminado.
Probablemente sea una buena idea asignar solo el espacio que necesita. Puedes usar snprintf
para eso como este:
// Determine how much space the string needs.
int size = snprintf(NULL, 0, "%d", pid);
// Allocate the required space plus NULL termination.
char * id = malloc(size + 1);
// Actually print the string.
sprintf(id, "%d", pid);
No estoy seguro de lo que estoy haciendo mal. Estoy tratando de concatenar el hostname
con pid
para crear 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;
}
EDITAR:
Código actualizado después de leer algunas respuestas:
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;
}
EDITAR:
Código de trabajo:
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;
}
No estoy seguro de dónde está segfaulting pero tiene algunos problemas.
snprintf () es mucho más seguro y no rebasará el buffer id []. sprintf podría rebasar el buffer
sprintf (id, "% s% d", pid) es malo como se mencionó anteriormente.
La Id. de retorno es mala ya que devuelve el puntero a un valor en la pila. Tan pronto como regrese, la pila ya no es suya.
sprintf(id, "%s%d", pid);
Tiene dos selectores% sy% d, pero solo un parámetro (pid). Necesitas poner una cadena y un entero en lugar de simplemente el entero.