为什么C允许尚未创建的变量使用sizeof运算符?

问题描述 投票:1回答:2

请考虑以下示例代码:

#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的指针声明不同?

c sizeof
2个回答
2
投票

在大多数情况下,sizeof编译时


1
投票
sizeof运算符的操作数将被

not

© www.soinside.com 2019 - 2024. All rights reserved.