当 malloc() 函数被用来申请0字节空间时,会发生什么?
// malloc_zero_memory_explore.c
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
char *c_ptr = NULL;
int *i_ptr = NULL;
double *d_ptr = NULL;
c_ptr = (char *) malloc(0);
i_ptr = (int *) malloc(0);
d_ptr = (double *)malloc(0);
printf("c_ptr = %p\n", c_ptr);
printf("i_ptr = %p\n", i_ptr);
printf("d_ptr = %p\n", d_ptr);
printf("\n");
printf("sizeof(c_ptr) = %lu byte\n", sizeof(c_ptr));
printf("sizeof(i_ptr) = %lu byte\n", sizeof(i_ptr));
printf("sizeof(d_ptr) = %lu byte\n", sizeof(d_ptr));
printf("\n");
printf("sizeof(*c_ptr) = %lu byte\n", sizeof(*c_ptr));
printf("sizeof(*i_ptr) = %lu byte\n", sizeof(*i_ptr));
printf("sizeof(*d_ptr) = %lu byte\n", sizeof(*d_ptr));
printf("\n");
printf("*c_ptr = %c\n", *c_ptr);
printf("*i_ptr = %d\n", *i_ptr);
printf("*d_ptr = %f\n", *d_ptr);
return 0;
}
下面是运行的结果:
运行环境为 Ubuntu 20.04,gcc version 9.3.0
c_ptr = 0x5635a950e2a0
i_ptr = 0x5635a950e2c0
d_ptr = 0x5635a950e2e0
sizeof(c_ptr) = 8 byte
sizeof(i_ptr) = 8 byte
sizeof(d_ptr) = 8 byte
sizeof(*c_ptr) = 1 byte
sizeof(*i_ptr) = 4 byte
sizeof(*d_ptr) = 8 byte
*c_ptr =
*i_ptr = 0
*d_ptr = 0.000000
结论:
1. 调用多次 malloc(0) 函数,返回值并不会是同一个地址空间,在上述开发环境中,相差32位的地址;
2. 此地址所指向的内存空间上的值全是0;