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.
| 归档时间: |
|
| 查看次数: |
99 次 |
| 最近记录: |