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

标签 c struct syntax

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/

相关文章:

R > 4.1 语法 : Error: function 'function' not supported in RHS call of a pipe

C编程。 FizzBu​​zz 程序

c - 这个C代码有问题

c - 指向 C 中结构的指针

c# - 一道C#语法问题

C# 不寻常的继承语法 w/generics

c - 当我运行代码两次(一段时间/执行一段时间之后)时,scanf 无法按预期工作。 (我使用 Visual C++ Windows 控制台应用程序)

c++ - 为什么乘以常数有符号整数分数没有优化?

c - 基本结构问题C

c++ - 在 C++ 中初始化结构数组