malloc分配含指针成员的结构体指针时的内存问题咨询
关于queue_t内存分配的问题解答
先回顾你定义的结构体:
typedef struct list_ele { char *value; struct list_ele *next; }list_ele_t; typedef struct { list_ele_t *head; int qSize; }queue_t;
下面逐个解答你的问题:
1. 执行queue_t *q = malloc(sizeof(queue_t));时发生了什么?
这条语句会从程序的堆内存中,申请一块大小刚好能容纳queue_t结构体的内存空间,然后把这块空间的起始地址赋值给指针q。此时q指向的内存里包含两个成员:
head:一个list_ele_t*类型的指针变量,但它的值是随机的(野指针),因为malloc不会初始化分配的内存;qSize:一个int类型的变量,值也是随机的。
你需要手动初始化这两个成员,比如把qSize设为0,head设为NULL或者指向一个有效的节点。
2. malloc分配的内存大小是多少?
分配的大小就是sizeof(queue_t)的结果,这个值由两部分决定:
- 结构体成员的总大小:
list_ele_t*的大小 +int的大小; - 编译器的内存对齐填充字节(为了让CPU访问内存更高效)。
举个例子:
- 32位系统中,指针占4字节,int占4字节,总大小是8字节(无需填充);
- 64位系统中,指针占8字节,int占4字节,编译器通常会填充4字节,让整个结构体大小对齐到8字节的倍数,最终是16字节。
你可以用printf("%zu\n", sizeof(queue_t));直接打印出具体大小。
3. 是否需要用q->head = malloc(sizeof(list_ele_t));为head申请空间?
这取决于你的队列初始化需求:
- 如果你的队列初始状态是空的,不需要分配这块内存,反而应该把
q->head设为NULL,同时把q->qSize设为0,这样能明确表示队列没有节点; - 如果你的队列初始化时就需要包含一个节点,那才需要执行这条语句,分配一个
list_ele_t的内存给head,同时记得初始化这个节点的value和next(比如把next设为NULL),并把qSize设为1。
注意:不管哪种情况,刚malloc完q之后,q->head是野指针,必须手动处理(要么设为NULL,要么分配有效内存),否则后续访问q->head的成员会导致程序崩溃或未定义行为。
内容的提问来源于stack exchange,提问作者0130
相关产品推荐
相关产品推荐

