首页 > 解决方案 > 为什么 C 允许对尚未创建的变量使用 sizeof 运算符?

问题描述

考虑以下示例代码:

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

int main(void) {
    int *a = malloc(sizeof *a);
    *a = 5;
    free(a);
    return 0;
}

在本例中,我在堆上分配整数a并将其初始化为 5。这一行具体

int *a = malloc(sizeof *a);

是什么让我感到困惑(sizeof *a部分)。对我来说,这看起来像是我试图在变量创建之前获取它的大小,但我发现这种初始化指针的方式非常普遍。当我用 clang 编译这段代码时,我没有收到任何错误或警告。为什么编译器允许这样做?据我所知,这类似于做类似的事情

int a = a + 1;

没有任何先前的声明a。这会产生警告clang -Wall main.c

main.c:17:13: warning: variable 'a' is uninitialized when used
      within its own initialization [-Wuninitialized]
    int a = a + 1;

是什么让这一行与指针声明不同sizeof

标签: csizeof

解决方案


除非它是可变长度数组,否则不会sizeof计算运算符的操作数。仅查看它以确定其类型。

此行为记录在C 标准的第 6.5.3.4p2 节中:

运算符产生其sizeof操作数的大小(以字节为单位),它可以是表达式或带括号的类型名称。大小由操作数的类型决定。结果是一个整数。 如果操作数的类型是变长数组类型,则计算操作数;否则,不计算操作数,结果是一个整数常量。

在这种情况下,它知道*a有 类型int,因此*a不求值并且sizeof *a与 相同sizeof(int)


推荐阅读