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

sizeof()处理指针解引用的原理、合法性及C标准依据问询

关于sizeof(*ptr)的常见疑问解答

先看你给出的代码示例:

#include <stdio.h>
#include <stdlib.h>

struct x {
       int a;
       int b;
};

int main(void) {

    struct x *ptr = malloc(sizeof(*ptr));
    return 0;
}

针对你提出的三个疑问,逐一解答:

1. sizeof(*ptr)的工作原理是什么?

sizeof是C语言的编译时运算符,它的作用是计算操作数的类型大小,而非操作数实际存储的值。这里的*ptr虽然写法是解引用,但编译器并不会真的去访问ptr指向的内存,它只会识别出*ptr的类型是struct x,然后计算这个结构体类型在当前编译环境下的字节大小(比如两个int组成的结构体,通常占8字节,具体大小取决于平台)。

2. 未定义的指针被解引用并传入sizeof()为何能得到正确大小?这难道不会导致未定义行为吗?

不会触发未定义行为,核心原因在于sizeof的求值特性:

  • 除非操作数是变长数组(VLA),否则sizeof的计算完全在编译阶段完成,不会在运行时执行解引用操作。
  • 未定义行为的产生是因为运行时实际访问了无效内存,但这里sizeof根本不会去读取ptr指向的地址,只是分析其类型,所以不存在访问无效内存的情况,自然不会触发未定义行为。

3. C标准是否定义了此类行为?是否属于C语言合法操作?

这是C标准明确允许的合法操作。
C标准(包括C99、C11及后续版本)规定:对于非变长数组的表达式,sizeof求值时不会计算表达式的副作用(也就是不会执行表达式里的操作,比如解引用、自增等),仅根据表达式的静态类型来计算大小。所以sizeof(*ptr)这种写法完全符合标准,是合规的。

内容的提问来源于stack exchange,提问作者professional pro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 06:37:06