C语言结构体指针内存分配疑问:成员指针是否需单独分配及内存范围
关于C语言结构体指针成员的内存分配问题
你的结构体定义与内存分配代码
typedef struct data_t{ type_0 *data_0; ... type_n *data_n; } data_t; // 补充:原定义缺少结构体别名,否则编译会报错
data_t *data = malloc(sizeof(*data));
问题解答
- 是否需要为结构体中的每个成员指针分配内存?
是的,必须单独为每个成员指针分配内存。
你调用malloc(sizeof(*data))仅为data_t结构体本身分配了内存——这块内存里只存储了各个指针成员(data_0到data_n)的存储空间(每个指针在32位系统占4字节,64位系统占8字节),但这些指针此时是野指针,指向随机的无效内存地址,没有可供存储数据的实际空间。如果要通过这些指针存储数据,必须再调用malloc为每个指针分配对应类型的内存,示例:
data->data_0 = malloc(sizeof(type_0)); // 分配单个type_0类型的内存 data->data_n = malloc(sizeof(type_n) * 5); // 分配能存5个type_n类型数据的内存
- 成员指针分配的内存是否在结构体的内存范围内?
不在。
结构体的内存区域仅用来存放各个指针成员的地址值,而为成员指针调用malloc分配的是另一块完全独立的堆内存,它的地址和结构体的内存地址没有重叠,是malloc从堆空间中单独划分的区域。简单来说:结构体内存存的是"指向数据的地址",成员指针指向的是"实际数据的存储地址",二者是完全分离的两块内存。
内容的提问来源于stack exchange,提问作者Daniel Muñoz
相关产品推荐
相关产品推荐

