C struct指针从第一个元素到最后一个元素

时间:2015-03-08 17:22:18

标签: c pointers struct

提供结构测试:

#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结构中的下一个元素?)

2 个答案:

答案 0 :(得分:2)

对于指针,大多数情况下,您总是会观察到这种行为,但C语言唯一的保证是元素在内存中排序。两者之间可能存在差距,以优化字段的对齐(用于性能,特别是在RISC体系结构上)。

执行此操作的正确方法是使用offsetof宏,或将其设为数组。

答案 1 :(得分:1)

正如对该问题的评论所述:

  

是;结构的元素按它们声明的顺序存储。什么可以扰乱计算是元素之间可能存在间隙(填充)。当它们属于同一类型时,它不会发生。

     

然而,你应该问自己:如果我需要顺序遍历元素,为什么我不使用数组?数组是为顺序访问而设计的;结构不是(并且编写代码来顺序访问结构的元素)。

该标准的一些相关部分是:

  

§6.7.2.1结构和联合说明符

     

¶6如6.2.5中所讨论的,结构是由一系列成员组成的类型,其成员   存储按有序顺序分配,而union是由序列组成的类型   存储重叠的成员。

     

¶15在结构对象中,非位字段成员和位域中的单位   驻留的地址按声明的顺序增加。指向a的指针   结构对象,适当转换,指向其初始成员(或者如果该成员是a   位字段,然后到它所在的单元,反之亦然。可能有未命名的   在结构对象中填充,但不在其开头。

     

§6.2.5类型

     

¶20......

     
      
  • 结构类型描述顺序分配的非空成员对象集   (并且,在某些情况下,是一个不完整的数组),每个都有一个可选的   指定的名称和可能不同的类型。
  •