2010-06-04 31 views
0
void my_cool_function() 
{ 
    obj_scene_data scene; 
    obj_scene_data *scene_ptr = &scene; 
    parse_obj_scene(scene_ptr, "test.txt"); 
} 

爲什麼我會永遠創建一個指向一個局部變量如上,如果我可以做在聲明堆棧中變量的指針時是否有任何要點?

void my_cool_function() 
{ 
    obj_scene_data scene; 
    parse_obj_scene(&scene, "test.txt"); 
} 

以防萬一它是相關的: INT parse_obj_scene(obj_scene_data * DATA_OUT,字符*文件名);

+0

我對替代例如糾正一個小錯誤 – leonbloy 2010-06-04 19:53:57

回答

5

在您鏈接的特定代碼中,沒有真正的原因。

如果您有一個功能需要obj_scene_data **,它可能是功能上必要的。你不能做&&scene,所以你必須在傳遞地址之前創建一個局部變量。

4

是的,你絕對可以做到這一點,原因很多。

例如,如果你想通過指針迭代堆棧分配數組的成員。

或者在其他情況下,如果您想有時指向一個內存地址,而其他時間指向另一個內存地址。你可以通過if語句設置一個指向一個或另一個的指針,然後在同一個範圍內使用你的通用代碼。

通常在這些情況下,當您的堆棧分配內存超出範圍時,指針變量會超出範圍。如果您在相同範圍內使用指針,則不會造成任何傷害。

在你確切的例子中,沒有很好的理由去做。

0

如果parse_obj_scene()是一個函數,可能沒有理由創建一個單獨的指針。但是,如果出於某種不合理的原因它是一個宏,可能需要重新賦值給指針來迭代主題數據。

0

不用語義,實際上有一個更一般的觀點,你可以用函數調用替換所有局部變量而不改變語義,並給出合適的編譯器優化,效率相等。 (參見"Lambda: The Ultimate Imperative"的第2.3節)。

但是,編寫代碼與下一個人通信以維護它,並且在沒有尾部調用優化的命令式語言中,通常使用局部變量來處理迭代的事物結束自動結構,並簡化表達式。因此,如果它使代碼更具可讀性,那就使用它。

1

如果該函數接受一個NULL指針作爲輸入,並且想要根據某些條件決定是否傳遞NULL,則指向堆棧變量的指針非常有用,以避免必須在單獨的代碼路徑中調用相同的函數,特別是如果其餘參數是相同的,否則。例如,而不是這樣的:

void my_function() 
{ 
    obj_data obj = {0}; 
    if(some condition) 
     other_function(&scene, "test.txt"); 
    else 
     other_function(NULL, "test.txt"); 
} 

你可以這樣做:

void my_function() 
{ 
    obj_data obj = {0}; 
    obj_data *obj_ptr = (condition is true) ? &obj : NULL; 
    other_function(obj_ptr, "test.txt"); 
}