C语言中struct Node *ptr = malloc(sizeof(*ptr))的运行原理是什么?
问题核心结论
sizeof 是编译期运算符,不会在运行时读取ptr的内容,你疑惑的“提前知晓ptr内容”的情况根本不存在。
代码完整执行流程
我们把整个过程拆成编译、运行两个阶段解释:
1. 编译阶段(程序运行前就完成)
- 编译器先处理变量声明部分:识别到
struct Node *ptr的定义,明确ptr是指向struct Node类型的指针 - 遇到
sizeof(*ptr)时,编译器只需要推导*ptr的类型是struct Node,直接计算出该结构体的固定大小作为常量值,全程不会操作运行时的ptr变量 - 最终这行代码会被编译器等价转换为
struct Node *ptr = malloc(sizeof(struct Node));,两种写法效果完全一致,前者的优势是不需要重复写结构体名,后续修改ptr的指向类型时不需要同步修改sizeof的参数,降低出错概率
2. 运行阶段(程序实际执行时的顺序)
- 先执行
malloc调用:传入编译阶段已经算好的struct Node大小常量,在堆上申请对应大小的内存空间,返回内存块的起始地址 - 再执行赋值操作:把
malloc返回的合法内存地址赋值给ptr,此时ptr才真正指向可用的结构体内存
常见误区提醒
注意不要把
sizeof(*ptr)写成sizeof(ptr):后者计算的是指针变量本身的大小,32位系统下固定为4字节、64位系统下固定为8字节,和struct Node的实际大小无关,写漏*会导致内存申请不足,后续操作出现越界问题。
内容的提问来源于stack exchange,提问作者wrosen01
相关产品推荐
相关产品推荐

