2010-11-28 38 views
0

我仍然是C的noob。我經常使用它,但通常不使用C的指針特性。我正在嘗試做什麼是指向已存在於函數內的本地空間中的結構的指針。我有這樣的代碼:C中的指針以及如何通過局部變量作爲指針

struct WorldCamera p_viewer; 
struct Point3D_LLA p_subj; 
struct Point2D_CalcRes p_res; 
p_viewer.hfov = 25; 
p_viewer.vfov = 25; 
p_viewer.p.lat = 10.0f; 
p_viewer.p.lon = 10.0f; 
p_viewer.p.alt = 100.0f; 
p_subj.lat = 9.98f; 
p_subj.lon = 10.0f; 
p_subj.alt = 100.0f; 
// Do something interesting here. 
compute_3d_transform(&p_viewer, &p_subj, &p_res, 10000.0f); 
// Do something interesting here. 

compute_3d_transform的原型是這樣的:

void compute_3d_transform(struct WorldCamera *p_viewer, struct Point3D_LLA *p_subj, struct Point2D_CalcRes *res, float cliph); 

我想知道,如果我有這個權利。我正在編寫一個小型微控制器,我認爲它沒有太多的內存保護。破壞一塊內存可能會在未來造成奇怪的錯誤,這將很難調試。我試圖避免使用malloc/calloc函數,因爲這些需要專用的堆。

+0

看起來像你找到了我。 – sizzzzlerz 2010-11-28 17:32:27

回答

5

使用運算符&的地址。

啊,你是對的。

爲什麼你是不是正確的是,對於例如,&p_viewer是指向(您例如,本地)變量p_viewer,這是一個struct WorldCamera指針的原因。而compute_3d_transform想要一個指向struct WorldCamera的指針,所以你作爲調用者的意圖與被調用者的意圖相匹配。

當然,沒有看到整個意圖(只能通過閱讀該程序,包括compute_3d_transform,或至少其文檔收集),可能有邏輯錯誤,但事實上,類型匹配已經是極大的安慰(當然,如果類型爲void *,而不是再有更多的麻煩,因爲目的不是很清楚)

1

我猜你的compute_3d_transform功能將其結果爲p_res - 如果這就是它所做的一切,你的代碼很好。

只要確保不要將指針存儲到其他地方的變量,以便在變量超出範圍後可以使用它們。

+0

正確,它將結果寫入p_res。 – 2010-11-28 17:37:41

0

你的代碼是正確的,並且內存損壞是不太可能的。

想到的事情是任何傳遞指針的函數的副作用。特別是在指向堆棧分配數據的指針時,一旦從包含數據的函數返回,這些指針應被視爲無效。這一切都歸結於知道你的指針發生了什麼。功能可能使用查看器和主題參數作爲輸入,並填充結果參數指向的區域。它不存儲指針,因此它們可能會在以後使用,因此compute_3d_transform完成後沒有任何副作用。 (僅用作輸入的指針參數通常標記爲const,爲了達到該功能的目的,將目標區域標記爲常量。)