1

我需要知道两个子结构之间的内存距离

(&my_type.a - &my_tape.b.c)

结果的类型是什么?我需要将它转换为(signed int),所以显然它是别的东西。

4

3 回答 3

6

根据 C11 标准,§6.5.6/9,

当两个指针相减时……结果的大小是实现定义的,其类型(有符号整数类型)ptrdiff_t在标头中定义<stddef.h>

于 2013-11-12T10:08:52.047 回答
1

您可以使用 a size_t(通常是 unsigned int )如果您需要它有符号使用,ssize_t 请参阅C 中的 size_t 是什么?

编辑:您可能应该使用ptrdiff_t它,请参阅http://www.viva64.com/en/a/0050/

于 2013-11-12T09:37:52.797 回答
0

首先,您不能获取类型成员的地址。如果my_type是类型名称,则&my_type.a不是有效的表达式。您首先需要一个类型的对象。例如,您可以使用my_type foo; (&foo.a - &foo.b.c).

其次,如果ac不是字符类型,那么&foo.a - &foo.b.cC 标准没有定义的结果,即使它们是相同的类型。只有当指针是指向同一数组对象中的元素的指针或指向数组对象最后一个元素的指针时,C 标准才定义减去指针的结果。(为此,单个元素表现为一个元素的数组。)

您可以通过将指针转换为字符类型来获得定义的结果:

my_type foo;
(char *) &foo.a - (char *) &foo.b.c

此表达式的结果具有类型ptrdiff_t。定义它是因为整个对象foo可以被视为 的数组char,因此可以减去指向其中字节的指针。

于 2013-11-12T15:17:53.313 回答