假设我有这个结构:
typedef struct nKey {
int num;
widget* widget;
} NUMBER_KEY;
和一个函数:
void dialKey(widget* widget) {
// Need to print 'num' of the struct that this widget resides in
}
我该如何着手完成这项工作?我试过类似的东西:
printf("%d", * (int *) widget - sizeof(int)); // Failure.org
编辑:可以安全地假设传递的小部件实际上是 NUMBER_KEY 结构的成员
编辑:寻找问题的解决方案而不是另一种方法。
最佳答案
正如 Michael 在他的回答中所解释的那样,您不能在给定的约束条件下执行此操作,因为无法“返回”指针图。为了使事情更明显,让我画一个涉及的对象图(用 C 术语,而不是 OOP 意义上的):
+- NUMBER_KEY --+
| ... | points to
| widget field -+-----------+
| ... | |
+---------------+ | + widget +
+-->| ... |
| ... |
+-->| ... |
| +--------+
points to |
[widget argument]-----------+
注意箭头。它们是单向的——你可以从一个指针“走”到指向的值,但你不能“走”回去。因此,您可以引用函数的 widget
参数以获取 widget
对象,但是一旦到达那里,就无法判断还有谁指向它——包括 的任何实例code>NUMBER_KEY
结构。想一想:如果您有十几个其他指针指向同一个 widget
,其中一些来自不同的 NUMBER_KEY
对象怎么办?如果不在 widget
对象中保留所有指针的列表,它怎么可能跟踪它?如果您确实需要它,这就是您必须做的 - 使 widget
指向它拥有的 NUMBER_KEY
。
关于c struct 通过偏移量获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1208954/