【发布时间】:2020-11-19 12:53:03
【问题描述】:
考虑一下:
void* x = &x;
printf("%p\n", x);
令人惊讶的是,它编译并运行输出:
7ffb2f7248
x 怎么可能在x 还没有创建的情况下获取自己的地址?
编辑:请注意,在这种情况下,它的分配没有歧义,清楚地说明了究竟是什么问题。
【问题讨论】:
-
这很简单,因为当 declarator (
x) 被识别时,对象类型是完整的。void *x[] = { &x };更有趣,因为在完全解析 init-declarator 之前类型不完整。或void *x[] = { &x[2], 0, 0 };. -
引用:“令人惊讶的是,它编译并运行......”好吧,如果它没有,我会更惊讶。是什么让你认为它不应该?该代码定义了一个变量并对其进行了初始化——没有发生奇怪的事情。
-
你不应该用 C 和 C++ 标记这样的问题;不同语言的答案是不同的。请删除一个标签,如果您想询问该语言,请输入一个单独的问题。
-
这是一个非常有用的功能,它允许在 C:
int len=10; int* array = malloc(len*sizeof*array);中使用这种常见的数组分配模式。这样,数组的类型不必重复,当有人决定更改数组的类型时也不会产生错误。 -
Error with C++ syntax, compiler doesn't warn or error for int v = func(&v); 的副本(这个问题完全是关于地址的问题,至少自 2010 年以来就存在像
int x = x;这样的自引用问题)。 Why does this C code compile? 有 C 的措辞。可能可以标记为仅后一个问题的副本。
标签: c++ c pointers memory language-lawyer