You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 04:15:04