Pregunta

Estoy usando nombredir de libgen.h para obtener la ruta del directorio de la ruta de un nombre de archivo.

Este es el mismo de la firma:

char * dirname (char *path)

Cuando se compila en una máquina de 32 bits o usando -m32 con gcc, todo funciona bien.

Mi código es el siguiente:

char* path = "/path/to/my/file.txt";
char* path_cpy = strdup(path);
const char* dir = (const char*)dirname(path_cpy);

Si puedo compilar en una máquina de 64 bits, aparece el aviso:

"warning: cast to pointer from integer of different size"

Esto solucionará la advertencia, pero se bloquea en tiempo de ejecución:

const char* dir = (const char*)(uintptr_t)dirname(path_cpy);

Nunca han tratado de compilador cruzado de 32/64 bits antes, hay una manera de solucionar este problema?

¿Fue útil?

Solución

¿Está incluido el archivo de cabecera que incluye la definición de dirname (que de libgen.h en mi sistema, el registro /usr/include)?

Los sonidos de alerta "cast to pointer from integer of different size" como si fuera la fundición de una int, el código de retorno por defecto de las funciones sin prototipo definido.

Es probable que lo que sucede es que sus tipos de datos int y char * son del mismo tamaño de código de 32 bits, pero, cuando se cambia a 64 bits, son realmente diferentes tamaños.

Se pudo comprobar al imprimir a cabo sizeof(int) y sizeof(char*) y ver si son diferentes.

Otros consejos

Se han fracasado en proporcionar un prototipo para dirname (ya sea mediante la inclusión de libgen.h o prototipos de usted mismo), por lo que implícitamente solicitud Tipo int dirname();. Dado que este no coincide con la función real, el programa tiene un comportamiento indefinido. (En este caso, la mitad superior del puntero se trunca.)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top