estaba escribiendo un código usando malloc por algo y luego enfrentado a un problema, así que escribí un código de prueba que en realidad se resume toda la confusión que está por debajo ::asignación de memoria dinámica en 'c' Cuestiones
# include <stdio.h>
# include <stdlib.h>
# include <error.h>
int main()
{
int *p = NULL;
void *t = NULL;
unsigned short *d = NULL;
t = malloc(2);
if(t == NULL) perror("\n ERROR:");
printf("\nSHORT:%d\n",sizeof(short));
d =t;
(*d) = 65536;
p = t;
*p = 65536;
printf("\nP:%p: D:%p:\n",p,d);
printf("\nVAL_P:%d ## VAL_D:%d\n",(*p),(*d));
return 0;
}
Output:: [email protected]:~/Desktop/ad/A1/CC$ ./test
SHORT:2
P:0x9512008: D:0x9512008:
VAL_P:65536 ## VAL_D:0
Estoy asignando 2 bytes de memoria usando malloc. Malloc que devuelve un puntero void * se almacena en un puntero * void 't'.
Luego, después de que 2 punteros se declaran p - tipo entero yd - del tipo abreviado. luego asigné t a ambos * (p = t y d = t) * que significa que ambos d & p apuntan a la misma ubicación de memoria en el montón.
al intentar guardar 65536 (2^16) a (* d) recibo una advertencia de que el valor int grande se trunca, que es el esperado. Ahora volví a guardar 65536 (2^16) a (* p) que no causó ninguna advertencia.
* Al imprimir tanto (* p) como (d) obtuve valores diferentes (aunque cada uno corregido para su propio tipo de puntero definido).
Mi pregunta es:
aunque he asignado 2 bytes (es decir, 16 bits) de montón mem usando malloc cómo soy yo capaz de salvar a 65.536 en esos dos bytes (usando (p) que es un puntero de tipo entero). ?? tengo la sensación de que la causa de esto es el tipo automático converion of void a int * puntero (en p = t) así que la asignación de t a p lleva al acceso a regiones de memoria fuera de lo asignado a través de malloc. ??
Aunque todo esto está sucediendo, cómo desencadenando la misma región de memoria a través de (* p) y (* d) imprime dos respuestas diferentes (aunque esto también puede explicarse si lo que estoy pensando es la causa en la pregunta 1)
Puede alguien poner un poco de luz sobre esto, será muy appreciated..and también si alguien puede explicar las razones detrás de esto ..
Muchas gracias
Malloc puede estar redondeando la cantidad solicitada hacia un cierto multiplicador. No sé sobre * nix, pero a Windows le gusta redondearlo a múltiplos de 8 bytes. Si ese es el caso, está escribiendo fuera del área solicitada, pero se encuentra dentro del margen de seguridad y, por lo tanto, no está corrompiendo nada más. – DCoder
Ha abusado cuidadosamente de la potencia de fundición para obtener un comportamiento indefinido. C te da un gran poder y flexibilidad para hacer * cosas malas *. Tienes que tomar la responsabilidad de *** no hacerlos ***. – dmckee
@dmckee Sé que lo que estoy haciendo no debería hacerse, pero después de tropezar con esto, tenía curiosidad por saber las razones exactas detrás de esto, lo que inicialmente supuse era el hecho de que la conversión automática de tipo a int * de un byte 2 void void * lleva al puntero int * a acceder a más memoria que a 2 bytes porque en mi máquina int es de 4 bytes. Es correcto (mi suposición) – abhi