c struct 通过偏移量获取数据

标签 c struct offset

假设我有这个结构:

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/

相关文章:

c - 在 child 完成 exec 后与 child 共享文件描述符表

c - 使用宏初始化结构

r - 带偏移量的泊松 GLM 的伪 R²

javascript - 滚动时检测第一个顶部元素

c - 如何在 C 中定义 MPI 类型数组?

c - 无法链接 Rcpp 的 cpp 文件中的相关头文件

c# - 将列表中的结构体成员转换为数组

javascript - 如何在给定的偏移量处获取 HTML 字符串中的父元素?

c - 基本计算器问题的 Bison 语法

检查list2是否包含list1