【问题标题】:How does this code in C work?C 中的这段代码是如何工作的?
【发布时间】:2017-04-04 14:48:01
【问题描述】:
typedef struct {
    char a[6];
} foo;

printf("%d", (foo*)0 + 7);

为什么会打印出 42? 这个语法是如何工作的? foo* 到底是什么?

【问题讨论】:

  • 因为 42 是所有问题的答案.... ;)
  • 该代码有问题;字符串需要结束 "。
  • 它不会编译...
  • 它不可能“工作”。发布minimal reproducible example。
  • 这段代码什么也不做。它不会编译。一旦进行了必要的添加,它就会调用未定义的行为。任何答案都是正确的。问题是:问题是什么?阅读How to Ask,提供minimal reproducible example 并说明您的具体问题。

标签: c struct syntax


【解决方案1】:

这是您编译的程序版本:

#include <stdio.h>

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


int main()
{
  printf("%d", (foo*)0 + 7);
}

如果为 42 则输出,因为 foo 结构的大小为 6。表达式 (foo*)0 + 7(或其等效的 &amp;((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。

【讨论】:

  • 这是真的吗?不只是将 NULL 转换为 foo* 指针,然后在内存中打印 '(7 * sizeof (foo))' 字节的内容...?
  • @CharlieScott-Skinner 不,这里没有取消引用。 Try it here.
  • 您介意修改/扩展代码块之后的下几句,尤其是第二句吗?我很难跟上...
【解决方案2】:

也许我不明白你在问什么,但这可能会有所帮助。

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

foo myFoo;      // instanciate a foo object

printf("%d\n", (myFoo.a[0]) + 7);  // access the first element of the array in foo
printf("%d\n", *myFoo.a + 7);      // access the value of the first element's
                                   // address in the array

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-09
    • 1970-01-01
    • 2011-05-16
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多