typedef struct {
char a[6];
} foo;
printf("%d", (foo*)0 + 7);
为什么打印出 42? 这种语法是如何工作的,foo* 到底是什么?
最佳答案
这是编译程序的版本:
#include <stdio.h>
typedef struct {
char a[6];
} foo;
int main()
{
printf("%d", (foo*)0 + 7);
}
输出 if 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));
但是它不会再打印 42
而是像 0000002a
这样的十六进制 42。
关于c - C中的这段代码如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43210567/