具有自动存储期限的变量的地址可以在其定义中取吗?

2023-11-30

是否允许在其定义的右侧获取对象的地址,如发生在foo() below:

typedef struct { char x[100]; } chars;

chars make(void *p) {
  printf("p = %p\n", p);
  chars c;
  return c;
}

void foo(void) {
  chars b = make(&b);
}

如果允许,对其使用是否有任何限制,例如打印是否可以,我可以将其与另一个指针进行比较等吗?

实际上,它似乎可以在我测试的编译器上进行编译,大多数时候都具有预期的行为(但是不总是),但这远非保证。


要回答标题中的问题,考虑到您的代码示例,是的,可能会。 C 标准说了这么多§6.2.4:

对象的生命周期是程序执行期间的部分 保证为其保留哪个存储空间。一个物体存在, 有一个恒定的地址,并始终保留其最后存储的值 它的寿命。

对于这样一个不具有变长数组类型的对象, 它的生命周期从进入它所在的块开始延伸 关联直到该块的执行以任何方式结束。

所以是的,您可以从声明点获取变量的地址,因为对象在此时具有地址并且它在范围内。下面是一个浓缩示例:

void *p = &p;

它的作用很小,但完全有效。

至于你的第二个问题,你能用它做什么。我主要可以说,在初始化完成之前我不会使用该地址来访问对象,因为初始化程序中表达式的求值顺序未指定(§6.7.9)。你很容易发现你的脚被踢掉了。

确实会出现这种情况的一个地方是在定义各种需要自引用的表格数据结构时。例如:

typedef struct tab_row {
  // Useful data
  struct tab_row *p_next;
} row;

row table[3] = {
  [1] = { /*Data 1*/, &table[0] },
  [2] = { /*Data 2*/, &table[1] },
  [0] = { /*Data 0*/, &table[2] },
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有自动存储期限的变量的地址可以在其定义中取吗? 的相关文章

随机推荐