提供结构测试:
#include <stdio.h>
int main() {
struct {
char* one;
char* two;
char* three;
} test;
char **ptr = &test.one;
*ptr = "one";
*++ptr = "two";
*++ptr = "three";
printf ("%s\n", test.one);
printf ("%s\n", test.two);
printf ("%s\n", test.three);
}
问题:是否保证test
结构中的元素始终处于连续的内存顺序? (因此从第一个结构元素++ptr
开始将始终指向test
结构中的下一个元素?)
答案 0 :(得分:2)
对于指针,大多数情况下,您总是会观察到这种行为,但C语言唯一的保证是元素在内存中排序。两者之间可能存在差距,以优化字段的对齐(用于性能,特别是在RISC体系结构上)。
执行此操作的正确方法是使用offsetof宏,或将其设为数组。
答案 1 :(得分:1)
正如对该问题的评论所述:
是;结构的元素按它们声明的顺序存储。什么可以扰乱计算是元素之间可能存在间隙(填充)。当它们属于同一类型时,它不会发生。
然而,你应该问自己:如果我需要顺序遍历元素,为什么我不使用数组?数组是为顺序访问而设计的;结构不是(并且编写代码来顺序访问结构的元素)。
该标准的一些相关部分是:
§6.7.2.1结构和联合说明符
¶6如6.2.5中所讨论的,结构是由一系列成员组成的类型,其成员 存储按有序顺序分配,而union是由序列组成的类型 存储重叠的成员。
¶15在结构对象中,非位字段成员和位域中的单位 驻留的地址按声明的顺序增加。指向a的指针 结构对象,适当转换,指向其初始成员(或者如果该成员是a 位字段,然后到它所在的单元,反之亦然。可能有未命名的 在结构对象中填充,但不在其开头。
§6.2.5类型
¶20......
- 结构类型描述顺序分配的非空成员对象集 (并且,在某些情况下,是一个不完整的数组),每个都有一个可选的 指定的名称和可能不同的类型。