问题标签 [offsetof]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
354 浏览

c - C 编程,使用 container_of() 宏获取值时出错

我创建了以下代码来理解 offsetof() 和 container_of() 宏。这里 printf() 显示两个不同的地址而不是相同的地址。我究竟做错了什么?

0 投票
1 回答
276 浏览

linux - 结构的大小与结构的最后一个元素的偏移量

我有一个由几个元素组成的 C 结构。当我在结构的最后一个元素上键入 offsetof() 时,它显示 144,而 sizeof() 最后一个元素是 4。所以,我假设结构的大小是 148。但是,在结构本身上运行 sizeof()返回值 152。我对偏移量有什么误解吗?结构的大小不应该是 148 而不是 152?是否有某种填充被应用于适合字节?我在 Ubuntu 14 的 64 位平台上运行。

元素 C 的偏移量为 148(可能是因为未应用填充),但结构 A 的大小为 152(很可能是由于填充),因此,当执行 memcpy 时,分配给元素 C 的值被清零。

更新:刚刚验证 sizeof() 元素 C 是 4 个字节,因此,它在第 148 个偏移量之后立即包含在内是有意义的。

0 投票
3 回答
393 浏览

c - &((struct name *)NULL -> b) 在 printf 语句中

我在一本书中找到了这个代码示例,但我无法理解 printf 语句中的表达式。该程序编译成功,输出为4。请告知...

0 投票
6 回答
4188 浏览

c - &((struct name *)NULL -> b) 在 C11 中是否会导致未定义的行为?

代码示例:

这会导致未定义的行为吗?我们可以辩论它是否“取消引用 null”,但是 C11 没有定义术语“取消引用”。

6.5.3.2/4 明确表示*在空指针上使用会导致未定义的行为;但是它并没有说同样的->意思,也没有定义a -> b为存在(*a).b;它对每个运算符都有单独的定义。

->6.5.2.3/4 中的语义说:

后缀表达式后跟 -> 运算符和标识符指定结构或联合对象的成员。该值是第一个表达式指向的对象的命名成员的值,并且是一个左值。

但是,NULL不指向一个对象,所以第二句话似乎没有指定。

同样相关的可能是 6.5.3.2/1:

约束:

一元运算&符的操作数应该是一个函数指示符、一个 []或一元运算符的结果*,或者是一个左值,它指定一个不是位域且未使用寄存器存储类说明符声明的对象。

但是我觉得粗体文本是有缺陷的,应该读取可能指定对象的左值,根据 6.3.2.1/1(左值的定义 ——C99 弄乱了左值的定义,所以 C11 不得不重写它,也许这个部分错过了。

6.3.2.1/1 确实说:

左值是一个表达式(对象类型不是 void),它可能指定一个对象;如果左值在评估时未指定对象,则行为未定义

但是&运算符确实评估其操作数。(它不访问存储的值,但这是不同的)。

这条长长的推理链似乎表明代码导致了 UB,但是它相当脆弱,而且我不清楚标准的编写者的意图是什么。如果事实上他们有任何意图,而不是让我们来辩论:)

0 投票
2 回答
74 浏览

c - 如何为嵌入在结构中的联合的特定成员可移植地分配空间

考虑 C11 中的以下类型,其中 MyType1 和 MyType2 是先前声明的类型:

我想分配足够的内存malloc来保存tag属性和type1. 这可以通过便携式方式完成吗?我想,sizeof(tag) + sizeof(type1)由于对齐问题,可能无法正常工作。

我可以以可移植的方式从结构的开头计算 type1 的偏移量吗?

0 投票
2 回答
259 浏览

c++ - 反转指向成员的指针(即获取包含结构的地址)

我有一个结构(成员),它只能用作其他结构(容器)中的数据成员。按照惯例,成员的名称始终是 m。成员是否有可靠的方法来获取包含结构的地址?

我希望也许使用指向成员的指针&Container::m可能有助于从成员对象本身的地址计算回来?

0 投票
1 回答
72 浏览

c - 在自定义宏中使用 offsetof 宏

我正在尝试在我自己的另一个宏中使用 offsetof 宏,如下所示:

当我使用我的自定义宏时,编译器抱怨没有声明“成员”。是否有一种特殊的方法可以将结构成员名称解析为宏?

我正在使用 Microchip 的 XC32 编译器。

0 投票
1 回答
239 浏览

c - 在c中使用带有浮点数的offsetof

该代码适用于 int 但当我想使用 float 时它会失败,除非我将结构转换为字符指针。这是它的样子:

*(float *)(location + offset)= imput 不适用于浮点数,但转换位置和作为 int 指针的偏移量会。

我试过在网上找,但我找不到太多关于这个问题的信息。

0 投票
2 回答
1087 浏览

visual-studio - offsetof() 上的 Visual Studio 语法错误

我有类型:

但是当我尝试编译以下内容时:

Visual Studio 响应:

这里有什么问题?

我在用:

offsetof宏定义<stddef.h>如下:

通过淘汰。我已经确定编译器使用:

0 投票
1 回答
397 浏览

c++ - Boost Fusion Types offsetof

我目前正在尝试计算增强融合适应结构中数据成员的偏移量,但我不确定是否有一种优雅的方法可以这样做。我想做类似以下的事情:

关键是我不想在 offsetof 函数中明确声明“a”或“b”或“c”。这本身并没有那么有用,但我想在 boost for_each 循环中使用它,这样我就可以在编译时计算任何结构的所有数据成员的偏移量。

如果您有任何想法,我很想听听他们的意见!