c – printf语句有效吗?

c – printf语句有效吗?,第1张

概述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;
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;}

在上面的printf语句中,我正在访问“struct a”结构&的“next”指针.当我在dev编译器中运行程序时,它给了我有效的内存地址(虽然我还没有为它分配任何内存).对如何发生这种情况的解释将非常有帮助.

是否有任何内存分配给“下一个”& “prev”字段?

解决方法 让我们考虑一下这意味着什么:

&(A[0])->next

它是下一个指针的地址(不是它指向的地方,而是指针本身的地址).并且下一个指针是struct a的第一个元素,因此next的地址与其封闭的a的地址相同.

因此,表达式是A [0]引用的结构a的地址.在您的原始代码中,您永远不会在那里分配任何内容,因此它只是一个打印的垃圾值.正如@alk在另一个答案中指出的那样,你可以初始化变量A中的两个指针,然后你会看到第一个打印的值(比如0x0).

顺便说一下,如果你想快速初始化A,那么就这样做,而不是使用更详细的memset():

struct a *A[2] = {0};

它做同样的事情(将两个指针设置为0).

虽然打印的值是垃圾,但代码可能不是非法的.这可能看起来很令人惊讶,但请看这里:Dereferencing an invalid pointer,then taking the address of the result – 你有类似的东西,但不可否认你通过解除引用结构的一个成员而不是简单地使用*而更进了一步.所以我心中的开放性问题是:假设当foo是一个指针时,& * foo总是合法的(如上面的链接所示),对于& foo-> bar来说同样适用吗?

总结

以上是内存溢出为你收集整理的c – printf语句有效吗?全部内容,希望文章能够帮你解决c – printf语句有效吗?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1221073.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存