我需要知道两个子结构之间的记忆距离
(&my_type.a - &my_tape.b.c)
结果的类型是什么?我需要将它投射到(signed int)
,所以显然它是另一回事。
答案 0 :(得分:6)
根据C11标准,§6.5.6/ 9,
当减去两个指针时......结果的大小是实现定义的,其类型(有符号整数类型)在
ptrdiff_t
标题中定义为<stddef.h>
。
答案 1 :(得分:1)
你可以使用size_t
(通常是unsigned int)
如果您需要签名,请使用ssize_t
见What is size_t in C?
修改:你可能应该使用ptrdiff_t
来查看http://www.viva64.com/en/a/0050/
答案 2 :(得分:0)
首先,您不能获取类型成员的地址。如果my_type
是类型名称,则&my_type.a
不是有效表达式。您首先需要该类型的对象。例如,您可以使用my_type foo; (&foo.a - &foo.b.c)
。
其次,如果a
和c
不是字符类型,则&foo.a - &foo.b.c
的结果不是由C标准定义的,即使它们是彼此相同的类型。 C标准定义了仅当指针指向同一数组对象中的元素或者超过数组对象的最后一个元素的指针时才减去指针的结果。 (为此,单个元素表现为一个元素的数组。)
您可以通过将指针转换为字符类型来获取定义的结果:
my_type foo;
(char *) &foo.a - (char *) &foo.b.c
此表达式的结果具有类型ptrdiff_t
。它的定义是因为整个对象foo
可以被视为char
的数组,因此可以减去指向其中字节的指针。