我想知道是否可以将全局变量初始化为指向自身:
#include <stdio.h>
struct foo { struct foo *a, *b; } x = { &x, &x };
int main()
{
printf("&x = %p, x.a = %p, x.b = %p\n", &x, x.a, x.b);
return 0;
}
这段代码可以在 gcc
下编译并执行(所有三个指针打印结果相同)。
我想知道:
- 这可靠吗?
- 这是标准的吗?
- 这是可移植的吗?
编辑: 仅澄清一下,我怀疑在其自身初始化程序中是否可以使用 x
的地址。
%p
期望一个void*
,但参数是struct foo*
。 - Daniel Fischervoid *
,并且允许从void *
进行转换以使得函数如malloc
可以在没有显式转换的情况下工作,是这样吗? - Mattprintf
时,不会发生这种转换(变长参数,根本没有类型检查)。因此,printf
得到的是struct foo*
,但格式字符串需要void*
。如果您提高警告级别,编译器应该会警告您。严格来说,这甚至是未定义的行为,尽管它在大多数常见平台上都能正常工作(标准并不保证所有指针具有相同的大小和结构,但通常它们是相同的)。 - Daniel Fischer