我可以使用在指定初始化程式中初始化的變數嗎?
考慮以下清單:
struct A {
int a;
int * const a_ptr;
};
struct A foo(int a) {
struct A result = {
.a = a,
.a_ptr = &result.a
};
return result;
}
demo
我可以result在這個指定的初始化運算式中使用嗎?這種行為有定義嗎?此代碼可移植嗎?
更新
我的不好,該示例包含潛在的堆疊損壞。清單應該是:
struct A {
int a;
int * const a_ptr;
};
void foo(int a) {
struct A result = {
.a = a,
.a_ptr = &result.a
};
bar(&result);
}
uj5u.com熱心網友回復:
初始化本身很好。
在result宣告時,其地址(以及其欄位的地址)是常量。所以&result.a在result.
什么是一個問題,不過是,你回來這個結構的副本。此副本包含不再存在的區域變數的地址,因此嘗試使用a_ptr回傳結構的成員的值將觸發未定義行為。
uj5u.com熱心網友回復:
問題已經完全改變了,這是我的新答案:
你的代碼很好,你可以檢查一下,它不會在任何平臺上斷言。
您將指向區域變數的指標傳遞result給bar. 在bar那個區域變數仍然存在p指向那個變數(結果)。因此a_ptr仍然指向result.a。
但我只是想知道你想在這里實作什么。
#include <assert.h>
struct A {
int a;
int* const a_ptr;
};
void bar(struct A *p)
{
assert(p->a_ptr == &p->a);
}
void foo(int a) {
struct A result = {
.a = a,
.a_ptr = &result.a
};
bar(&result);
}
int main()
{
foo(2);
}
順便提一句:
struct A result = {
.a = a,
.a_ptr = &result.a
};
相當于:
struct A result;
result.a = a;
result.a_ptr = &result.a;
但對于后者,您需要宣告int* a_ptr;而不是int* const a_ptr;.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/338865.html
上一篇:int(*p)[10]=s和int(*o)[5]=&s有什么區別?
下一篇:為什么我不能向結構中添加字串?
