Lenguaje C: ¿qué resultado producirá malloc (0), es realmente un puntero nulo?

prefacio

(1) Vi a alguien en un grupo de comunicación hace unos días diciendo que es realmente asqueroso preguntar qué le pasa a malloc(0) en una entrevista.
(2) Esto de repente despertó mi curiosidad. ¿Todavía puedes malloc(0)? !
(3) Después de la prueba, se encontró que era factible. Después de buscar en Internet, el grupo de intercambio del hermano Ken y su propio entendimiento, lo clasifiqué en este blog.
(4) Página de inicio del blog de Kenge: Arquitecto Li Ken ;
(5) Sentimiento, los grandes del grupo merecen tener muchos años de experiencia en desarrollo. Mire el problema agudamente. Encontré el problema de inmediato, pero todavía era demasiado superficial. Por cierto, escuché que la trampa del libro C también explica esta parte del conocimiento. Aunque he oído hablar del nombre durante mucho tiempo, nunca lo he comprado.

resultados de la operación malloc (0)

(1) Uso printf para imprimir el área señalada por el puntero. Luego use la función malloc_usable_size() para detectar el tamaño de memoria solicitado. Por cierto, use la función strcpy() para detectar si el área tiene datos entrantes.
(2) Se encontró que el programa puede ejecutarse normalmente. No hay ningún error, ni un puntero nulo. A juzgar por el resultado devuelto por la función malloc_usable_size(), se ha solicitado un espacio de 24 bytes.

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>

int main()
{
    
    
	char* p=malloc(0);
	printf("p = %p \r\n",p);
	strcpy(p,"abc");	
	printf("malloc_usable_size(p) = %ld \r\n",malloc_usable_size(p));
	free(p);
	p = NULL;
	return 0;
}

inserte la descripción de la imagen aquí

análisis de código

(1) Después de consultar todo tipo de información en Internet, hay demasiados términos y realmente no puedo entenderlos. Así que decidí preguntar en el grupo de intercambio del hermano Ken. Pensé que hice una pregunta de alta calidad. Inesperadamente, que payasito, jajajaja.
(2) El apodo del grupo es Master Xu, un jefe de 9 años, e inmediatamente me lanzó un enlace ; esta es directamente la definición oficial del lenguaje C, lo que muestra claramente que si se pasa malloc en 0, el resultado será producido.
(3) Explicación oficial:
si el tamaño es cero, el comportamiento está definido por la implementación (se puede devolver un puntero nulo, o se puede devolver algún puntero no nulo que no se puede usar para acceder al almacenamiento, pero debe pasarse a std:: Traducción
: si el tamaño es cero, el comportamiento está definido por la implementación (puede devolver un puntero nulo o puede devolver algún puntero no nulo que no se puede usar para acceder al almacenamiento pero debe pasarse a std::free) .
(4) ¿Qué quieres decir?
<1> Es decir, si el valor pasado por malloc es 0, entonces se puede permitir que pase este comportamiento.
<2>Sin embargo, el resultado final de este comportamiento es un puntero nulo devuelto o alguna memoria a la que no se puede acceder. (Nota: no se puede acceder aquí. El resultado de mi operación anterior muestra que se puede acceder y no hay conflicto).
<3>Finalmente, también muestra que el valor devuelto por malloc debe liberarse a través del función libre().
(5) Luego hay otra pregunta, ¿por qué mi malloc(0) devuelve un espacio de 24 bytes? ¿Son estos 24 bytes?
No, según la información en Internet, el espacio devuelto por malloc(0) puede ser diferente en diferentes entornos.

Si se permite malloc(-1)

(1) Dado que malloc(0) está permitido, ¿qué pasa con malloc(-1)? A juzgar por los resultados de la ejecución, habrá errores.
(3) ¿Por qué malloc(0) funciona, pero malloc(-1) no funciona? Esto se debe a que, como se estipula en el estándar C, los parámetros que se pasan a malloc deben ser datos sin firmar. Pero revisé la información en Internet y descubrí que algunas personas dijeron que pasar -1 puede ejecutarse, tal vez haya un problema con el compilador, que analiza -1 en 0xff ff ff ff (en términos generales, el número predeterminado es 4 bytes, y el complemento de -1 es este).

inserte la descripción de la imagen aquí

Resumir

(1) El estándar del lenguaje C permite el comportamiento de malloc(0).
(2) Lo que devuelve malloc(0) no es necesariamente un puntero nulo, y los resultados producidos por diferentes entornos son diferentes. (3) No se puede acceder
al espacio al que apunta el puntero devuelto por malloc(0) . (¡¡De nuevo, es posible !!!) (4) El espacio devuelto por malloc(0) depende del entorno. (5) El puntero generado por malloc(0) debe pasarse a free() para su liberación.

Supongo que te gusta

Origin blog.csdn.net/qq_63922192/article/details/131233403
Recomendado
Clasificación