我可以使用在指定初始化程序中初始化的變量嗎?
考慮以下清單:
struct A {
int a;
int * const a_ptr;
};
struct A foo(int a) {
struct A result = {
.a = a,
.a_ptr = &result.a
};
return result;
}
我可以result
在這個指定的初始化表達式中使用嗎?這種行為有定義嗎?此代碼可移植嗎?
更新
我的不好,該示例包含潛在的堆棧損壞。清單應該是:
struct A {
int a;
int * const a_ptr;
};
void foo(int a) {
struct A result = {
.a = a,
.a_ptr = &result.a
};
bar(&result);
}
初始化本身很好。
在result
聲明時,其地址(以及其字段的地址)是常量。所以&result.a
在result
.
什麼是一個問題,不過是,你回來這個結構的副本。此副本包含不再存在的局部變量的地址,因此嘗試使用a_ptr
返回結構的成員的值將觸發未定義行為。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句