gpt4 book ai didi

c - 结构成员之间的指针差异?

转载 作者:太空狗 更新时间:2023-10-29 17:10:33 24 4
gpt4 key购买 nike

C99 标准规定:

When two pointers are subtracted, both shall point to elements of the same array object, or one past the last element of the array object

考虑以下代码:

struct test {
int x[5];
char something;
short y[5];
};

...

struct test s = { ... };
char *p = (char *) s.x;
char *q = (char *) s.y;
printf("%td\n", q - p);

这显然违反了上述规则,因为 pq 指针指向不同的“数组对象”,并且根据规则, q - p 差异未定义。

但在实践中,为什么这样的事情会导致未定义的行为?毕竟,结构成员是按顺序排列的(就像数组元素一样),成员之间可能存在任何填充。诚然,填充量会因实现而异,这会影响计算结果,但为什么结果应该是“未定义的”?

我的问题是,我们是否可以假设该标准只是对这个问题“一无所知”,或者是否有充分的理由不扩大这个规则?上面的规则不能改写为“都应指向同一数组对象的元素或同一结构的成员”吗?

我唯一的怀疑是分段内存架构,其中成员可能最终位于不同的段中。是这样吗?

我还怀疑这就是 GCC 定义自己的 __builtin_offsetof 的原因,以便对 offsetof 宏进行“符合标准”的定义。

编辑:

正如已经指出的,标准不允许对 void 指针进行算术运算。它是一个 GNU 扩展,仅当通过 GCC -std=c99 -pedantic 时才会发出警告。我正在用 char * 指针替换 void * 指针。

最佳答案

同一结构的成员地址之间的减法和关系运算符(在 char* 类型上)定义明确。

任何对象都可以被视为一个unsigned char数组。

引用 N1570 6.2.6.1 第 4 段:

Values stored in non-bit-field objects of any other object type consist of n × CHAR_BIT bits, where n is the size of an object of that type, in bytes. The value may be copied into an object of type unsigned char [ n ] (e.g., by memcpy); the resulting set of bytes is called the object representation of the value.

...

My only suspicion are segmented memory architectures where the members might end up in different segments. Is that the case?

没有。对于具有分段内存架构的系统,编译器通常会施加一个限制,即每个对象都必须适合单个段。或者它可以允许占用多个段的对象,但它仍然必须确保指针运算和比较正确工作。

关于c - 结构成员之间的指针差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26711687/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com