int main()
{
struct a
{
struct a *next;
struct a *prev;
};
struct a *A[2];
printf("Address of (&(A[0])->next) = %p",(&(A[0])->next));
getch();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在上面的printf语句中,我正在访问"struct a"结构的"next"指针,当我在dev编译器中运行程序时,它给了我有效的内存地址(尽管我还没有为它分配任何内存).对如何发生这种情况的解释将非常有帮助.
是否为"下一个"和"上一个"字段分配了内存?
让我们考虑一下这意味着什么:
&(A[0])->next
Run Code Online (Sandbox Code Playgroud)
它是next指针的地址(不是它指向的地方,而是指针本身的地址).并且next指针是第一个元素struct a,因此next地址与其封闭的地址相同a.
因此,表达式是所struct a引用的地址A[0].在您的原始代码中,您永远不会在那里分配任何内容,因此它只是一个打印的垃圾值.正如@alk在另一个答案中指出的那样,您可以初始化变量中的两个指针A,然后您会看到第一个值被打印(例如,0x0).
顺便说一句,如果你想快速初始化A,那就这样做,而不是更冗长memset():
struct a *A[2] = {0};
Run Code Online (Sandbox Code Playgroud)
它做同样的事情(将两个指针设置为0).
虽然打印的值是垃圾,但代码可能不是非法的.这可能看起来令人惊讶,但请看这里:取消引用一个无效的指针,然后取结果的地址 - 你有类似的东西,但不可否认你通过解除引用一个结构的成员而不是简单地更进一步使用*.所以我心中的开放性问题是:鉴于指针(如上面的链接所示&*foo)总是合法的foo,同样的情况是否适用&foo->bar?