请考虑以下示例代码:
#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
的指针声明不同?
在大多数情况下,sizeof
是编译时
sizeof
运算符的操作数将被not