example - Realloc x86 x86_64
memory allocation malloc (2)
Tengo una función
void *srealloc(void * ptr , int size){
void *tmp = realloc(ptr , size);
if(tmp == NULL){
fprintf(stderr,"realloc of %u bytes failed", size);
exit(1);
}
return tmp;
}
Mi código que llama a esto funciona bien en una computadora x86, pero cuando compilo y ejecuto el mismo código en mi computadora x64 obtengo una segfault.
Un ejemplo de cómo se llama esto es:
line = "Some string";
buffer = (char**) srealloc (buffer,sizeof(buffer)*(++buffer_lines));
buffer[buffer_lines-1] = line;
Cuando realizo un seguimiento con gdb cuando se llama a srealloc en la computadora segfaulting ptr == 0x0, size == 8
* Editar: El segfault ocurre en:
void *tmp = realloc(ptr, size);
Asegúrese de que el código que llama a realloc
tenga un prototipo válido para esa función (en otras palabras, incluya stdlib.h
).
Muchos problemas al cambiar de 32 a 64 bits implican la disparidad entre enteros (los argumentos predeterminados si no hay prototipo) y punteros. Mientras que los enteros pueden permanecer en 32 bits en una plataforma de 64 bits, los punteros pueden aumentar de tamaño.
Como usted declara que el puntero es NULL y el tamaño solicitado es 8, ese es ciertamente el uso válido de la función. Un realloc de un puntero nulo es efectivamente el mismo que un malloc. Es por eso que sospecho el problema del prototipo.
También asegúrese de que está compilando todo en la nueva máquina. Puede atacar si intenta vincular un srealloc
compilado de 32 bits con un cliente compilado de 64 bits.
Tu llamada se ve bien. Un bloqueo en malloc()
, realloc()
, calloc()
o free()
es a menudo un síntoma de un error en otro lugar de su programa, donde ha escrito más allá de los límites de un bloque asignado y pisoteado la información de limpieza utilizada por el funciones de asignación de memoria.
Intenta ejecutar tu programa en una herramienta como Valgrind o Purify.