C中的指针以及如何通过局部变量作为指针

问题描述:

我仍然是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

使用运算符&的地址。

啊,你是对的。

为什么你是不是正确的是,对于例如,&p_viewer是指向(您例如,本地)变量p_viewer,这是一个struct WorldCamera指针的原因。而compute_3d_transform想要一个指向struct WorldCamera的指针,所以你作为调用者的意图与被调用者的意图相匹配。

当然,没有看到整个意图(只能通过阅读该程序,包括compute_3d_transform,或至少其文档收集),可能有逻辑错误,但事实上,类型匹配已经是极大的安慰(当然,如果类型为void *,而不是再有更多的麻烦,因为目的不是很清楚)

我猜你的compute_3d_transform功能将其结果为p_res - 如果这就是它所做的一切,你的代码很好。

只要确保不要将指针存储到其他地方的变量,以便在变量超出范围后可以使用它们。

+0

正确,它将结果写入p_res。 – 2010-11-28 17:37:41

你的代码是正确的,并且内存损坏是不太可能的。

想到的事情是任何传递指针的函数的副作用。特别是在指向堆栈分配数据的指针时,一旦从包含数据的函数返回,这些指针应被视为无效。这一切都归结于知道你的指针发生了什么。功能可能使用查看器和主题参数作为输入,并填充结果参数指向的区域。它不存储指针,因此它们可能会在以后使用,因此compute_3d_transform完成后没有任何副作用。 (仅用作输入的指针参数通常标记为const,为了达到该功能的目的,将目标区域标记为常量。)