当前位置:  开发笔记 > 编程语言 > 正文

c struct通过offset获取数据

如何解决《cstruct通过offset获取数据》经验,为你挑选了1个好方法。

可以说我有这个结构:

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结构的成员

编辑:寻找问题的解决方案而不是另一种方法.



1> Pavel Minaev..:

正如迈克尔在他的回答中解释的那样,你无法用给定的约束来做到这一点,因为没有办法"向后走"指针图.为了使事情更加明显,让我绘制一个对象图(用C语言表示,而不是OOP意义上):

+- NUMBER_KEY --+
|  ...          | points to      
| widget field -+-----------+
|  ...          |           |
+---------------+           |   + widget +
                            +-->|  ...   |
                                |  ...   |
                            +-->|  ...   |
                            |   +--------+
                  points to |
[widget argument]-----------+

注意箭头.它们是单向的 - 你可以从指针"走"到指向值,但你不能"走"回来.所以你可以推导widget你的函数的参数来到达widget对象,但是一旦那里,就没有办法告诉别人指向它 - 包括NUMBER_KEY结构的任何实例.想想看:如果你有十几个其他指针widget,其中一些来自不同的NUMBER_KEY对象怎么办?如何在不保留widget对象内所有指针的列表的情况下跟踪它?如果你确实需要这个,那就是你必须要做的 - widget指出它拥有它NUMBER_KEY.

推荐阅读
手机用户2402852387
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有