问题标签 [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.
c - C 编程,使用 container_of() 宏获取值时出错
我创建了以下代码来理解 offsetof() 和 container_of() 宏。这里 printf() 显示两个不同的地址而不是相同的地址。我究竟做错了什么?
linux - 结构的大小与结构的最后一个元素的偏移量
我有一个由几个元素组成的 C 结构。当我在结构的最后一个元素上键入 offsetof() 时,它显示 144,而 sizeof() 最后一个元素是 4。所以,我假设结构的大小是 148。但是,在结构本身上运行 sizeof()返回值 152。我对偏移量有什么误解吗?结构的大小不应该是 148 而不是 152?是否有某种填充被应用于适合字节?我在 Ubuntu 14 的 64 位平台上运行。
元素 C 的偏移量为 148(可能是因为未应用填充),但结构 A 的大小为 152(很可能是由于填充),因此,当执行 memcpy 时,分配给元素 C 的值被清零。
更新:刚刚验证 sizeof() 元素 C 是 4 个字节,因此,它在第 148 个偏移量之后立即包含在内是有意义的。
c - &((struct name *)NULL -> b) 在 printf 语句中
我在一本书中找到了这个代码示例,但我无法理解 printf 语句中的表达式。该程序编译成功,输出为4。请告知...
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,但是它相当脆弱,而且我不清楚标准的编写者的意图是什么。如果事实上他们有任何意图,而不是让我们来辩论:)
c - 如何为嵌入在结构中的联合的特定成员可移植地分配空间
考虑 C11 中的以下类型,其中 MyType1 和 MyType2 是先前声明的类型:
我想分配足够的内存malloc
来保存tag
属性和type1
. 这可以通过便携式方式完成吗?我想,sizeof(tag) + sizeof(type1)
由于对齐问题,可能无法正常工作。
我可以以可移植的方式从结构的开头计算 type1 的偏移量吗?
c++ - 反转指向成员的指针(即获取包含结构的地址)
我有一个结构(成员),它只能用作其他结构(容器)中的数据成员。按照惯例,成员的名称始终是 m。成员是否有可靠的方法来获取包含结构的地址?
我希望也许使用指向成员的指针&Container::m
可能有助于从成员对象本身的地址计算回来?
c - 在自定义宏中使用 offsetof 宏
我正在尝试在我自己的另一个宏中使用 offsetof 宏,如下所示:
当我使用我的自定义宏时,编译器抱怨没有声明“成员”。是否有一种特殊的方法可以将结构成员名称解析为宏?
我正在使用 Microchip 的 XC32 编译器。
c - 在c中使用带有浮点数的offsetof
该代码适用于 int 但当我想使用 float 时它会失败,除非我将结构转换为字符指针。这是它的样子:
*(float *)(location + offset)= imput
不适用于浮点数,但转换位置和作为 int 指针的偏移量会。
我试过在网上找,但我找不到太多关于这个问题的信息。
visual-studio - offsetof() 上的 Visual Studio 语法错误
我有类型:
但是当我尝试编译以下内容时:
Visual Studio 响应:
这里有什么问题?
我在用:
offsetof
宏定义<stddef.h>
如下:
通过淘汰。我已经确定编译器使用:
c++ - Boost Fusion Types offsetof
我目前正在尝试计算增强融合适应结构中数据成员的偏移量,但我不确定是否有一种优雅的方法可以这样做。我想做类似以下的事情:
关键是我不想在 offsetof 函数中明确声明“a”或“b”或“c”。这本身并没有那么有用,但我想在 boost for_each 循环中使用它,这样我就可以在编译时计算任何结构的所有数据成员的偏移量。
如果您有任何想法,我很想听听他们的意见!