我有一個如上宣告的結構
struct foo {
void * elem;
};
我想在這個結構中管理elem的free(),但是我不知道elem的型別是什么,所以我正在做一個void *來管理所有資料型別。將指向區域變數的指標分配給 foo.elem 是否安全?
例如,這些方法安全嗎?
// Method 1
struct foo * get_foo() {
int a = 10;
struct foo x = malloc(sizeof(struct foo));
x.elem = &a;
return x;
}
// Method 2
void get_foo(struct foo x) {
int a = 10;
x.elem = &a;
}
uj5u.com熱心網友回復:
無論您的代碼示例作為您所詢問的示例的有效性(都沒有正確說明問題),在該變數的生命周期之外保留指向變數的指標永遠是無效或安全的。
取消參考這樣的指標是未定義的行為,原則上任何事情都可能發生。實際上,實際發生的情況是該變數的記憶體可供重用,如果您通過指標讀取它,它可能不再包含相同的值,如果您撰寫它,您可能正在修改一些不相關的資料物件或破壞呼叫stack - 任何一種情況下的行為都是不確定的;這對未定義的行為不再有用。
請注意,這是生命周期的問題,而不是范圍的問題。指向本地 static的指標是有效的。
uj5u.com熱心網友回復:
第一個不編譯。它不是安全代碼,因為它根本不是代碼。
第二個只是無用地修改了區域變數x。它是安全的,因為它實際上什么都不做,并且什么都不做本質上沒有什么害處。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/462790.html
