Dev - C++ - Problema curioso con memoria dinamica en c, malloc y printf.

 
Vista:
sin imagen de perfil

Problema curioso con memoria dinamica en c, malloc y printf.

Publicado por anonymous (2 intervenciones) el 18/01/2019 04:40:43
Hola, buen dia.
Gracias por leerme.

Recientemente estaba repasando algunos códigos de lenguaje c que utilizan la función malloc, este es el código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
main()
{
	char *a, b[80];
	gets(b);
	if((a=(char *)malloc(strlen(b)))==NULL)
	{
		printf("Sin asignacion de memoria\n");
		getchar();
		free(a);
		exit(0);
	}
	strcpy(a,b);
	printf("%s\t%s",a,b);
	getchar();
	free(a);
}

Lo que se hace es detectar el retorno de NULL en la función malloc(). Si al ejecutar el programa, el ejecutor del programa oprime la tecla return (enter), se mostrará en monitor “Sin asignación de memoria”. De otra forma se mostrará dos veces lo escrito por el ejecutor del programa.

Mi problema radica en que cuando das enter y la condición NULL se cumple, nunca se imprime en pantalla el mensaje sin asignación de memoria, solo se muestra una tabulación, depsues entra la función getchar() y el programa se cierra.
Adjunto imagen para que lo aprecien
Captura-de-pantalla-51

No se como puedo solucionar ese error de mi computador, ¿Qué podría ser?, en otro ordenador funciona como debería.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 417
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Problema curioso con memoria dinamica en c, malloc y printf.

Publicado por Thanatos (199 intervenciones) el 18/01/2019 17:28:39
No es un error del computador. Lo que sucede es que al ejecutar el programa y presionar enter, sin haber ingresado otro carácter previamente, strlen(b) devuelve el valor cero, y es ese valor el que recibe la función malloc() como argumento.

El estándar del lenguaje C, en su sección Funciones de administración de la memoria (Memory Management Functions), dice:

"If the size of the space requested is zero, the behavior is implementation-defined: either a null pointer is returned, or the behavior is as if the size were some nonzero value, except that the returned pointer shall not be used to access an object."

"Si el tamaño del espacio solicitado es cero, el comportamiento está definido por la implementación: devuelve un puntero nulo o el comportamiento es como si el tamaño fuera un valor distinto de cero, excepto que el puntero devuelto no debe usarse para acceder a un objeto."

La "implementación" son los componentes (compilador, librerías estándar, etc.) del lenguaje C. Los componentes que tu IDE (Dev-C++) está usando según la imagen que publicaste, son los del paquete TDM-GCC 4.9.2 de 64 bit. Quizás el otro ordenador en el que malloc devolvió NULL haya estado utilizando una implementación diferente. En ambos casos el puntero devuelto por malloc, sea NULL o no, se puede/debe usar como argumento de la función free().

Por otra parte, la función gets() está considerada obsoleta desde hace varios años y fue retirada del lenguaje C desde el estándar del año 2011.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Problema curioso con memoria dinamica en c, malloc y printf.

Publicado por anonymous (2 intervenciones) el 18/01/2019 18:14:02
Muchas gracias por responder de antemano amigo.

Agradezco tu respuesta. Lo único que no entiendo es como podría lograr que entonces malloc retorne la función Null cuando strlen es cero, véase mi caso, he analizado el código y veo que nunca me retorna NULL. ¿Qué es lo que podría aplicar entonces?.

Gracias, saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar