提供结构测试:
#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
struct中的元素始终按连续的内存顺序排列?(因此,从第一个struct元素开始++ptr
将始终指向该test
结构中的下一个元素吗?)
如对问题的评论中所述:
是的; 结构的元素按照声明的顺序存储。可能会打乱计算的是,元素之间可能存在间隙(填充)。当它们都是相同类型时,就不会发生。
但是,您应该问自己:如果我需要按顺序遍历元素,为什么不使用数组?阵列是为顺序访问而设计的。结构不是(并且编写代码以顺序访问结构的元素很麻烦)。
该标准的一些相关部分是:
第6.7.2.1节结构和联合说明符
¶6如6.2.5所述,结构是由成员序列组成的类型,其成员存储按有序序列分配,而联合则是由成员序列组成的类型,成员序列的存储重叠。
¶15在结构对象中,非位域成员和位域所在的单元的地址按照声明的顺序增加。指向经过适当转换的结构对象的指针指向其初始成员(或者,如果该成员是位字段,则指向它所驻留的单元),反之亦然。结构对象内可能有未命名的填充,但在其开始处没有。
§6.2.5类型
¶20…
- 结构类型描述了按顺序分配的成员对象的非空集合(在某些情况下,还包括不完整的数组),每个成员对象都有一个可选的指定名称和可能不同的类型。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句