C中的这段代码如何工作?

0 c syntax struct

typedef struct {
    char a[6];
} foo;

printf("%d", (foo*)0 + 7);
Run Code Online (Sandbox Code Playgroud)

为什么打印42?这个语法是如何工作的,foo*究竟是什么?

Jab*_*cky 10

这是您编译的程序版本:

#include <stdio.h>

typedef struct {
  char a[6];
} foo;


int main()
{
  printf("%d", (foo*)0 + 7);
}
Run Code Online (Sandbox Code Playgroud)

输出如果为42,因为foo结构的大小是6.表达式(foo*)0 + 7(或其等价物&((foo*)0)[7])因此表示地址42(0 + 6*7).

但实际上printf("%d", (foo*)0 + 7);是未定义的行为(即使输出很可能42在大多数平台上),因为对于打印指针值(地址指针值),您需要%p格式说明符并且需要转换为void*(C标准如此) .

所以它应该是:

printf("%p", (void*)((foo*)0 + 7));
Run Code Online (Sandbox Code Playgroud)

但是它不再打印了,42但是像0000002a十六进制的那样是42.