C 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);
}

问题:是否可以保证teststruct中的元素始终按连续的内存顺序排列?(因此,从第一个struct元素开始++ptr将始终指向该test结构中的下一个元素吗?)

乔纳森·勒夫勒(Jonathan Leffler)

如对问题的评论中所述:

是的; 结构的元素按照声明的顺序存储。可能会打乱计算的是,元素之间可能存在间隙(填充)。当它们都是相同类型时,就不会发生。

但是,您应该问自己:如果我需要按顺序遍历元素,为什么不使用数组?阵列是为顺序访问而设计的。结构不是(并且编写代码以顺序访问结构的元素很麻烦)。

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

第6.7.2.1节结构和联合说明符

¶6如6.2.5所述,结构是由成员序列组成的类型,其成员存储按有序序列分配,而联合则是由成员序列组成的类型,成员序列的存储重叠。

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

§6.2.5类型

¶20…

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在c中使用结构的地址和指针访问结构的第一个元素

C ++使用std库在向量中找到满足条件的第一个元素

为什么将\ 0定义为C中char数组的第一个元素?

当我将指针从Fortran传递到C ++时,第一个元素的值丢失了

C#htmlagilitypack选择嵌套元素中的第一个标签

数组的地址是否等于C ++中其第一个元素的地址?

当第二个元素是X时,C ++ Map获得第一个元素

指向C中数组的第一个元素

在对C#中的第一个和/或最后一个元素进行特殊处理时,如何评估IEnumerable <T>?

C ++:查找满足谓词的元组的第一个元素

C会在第一个元素之前填充结构吗?

C ++:我有两个数组,其中第一个元素和最后一个元素具有相同的内存地址

如何在C ++中交换队列的第一个和最后一个元素?

C ++如何比较set <int>从开始到最后一个元素-1

尝试引用char *中的第一个元素时,C中出现分段错误

如何检查数组c ++中的第一个元素和最后一个元素

访问第一个元素时出现C ++向量分割错误

C-交换单链列表中的第一个和最后一个元素

语言c char *从第二个元素而不是第一个元素开始

c ++ 98,向量,删除除第一个元素之外的所有元素

删除 Char * Array Objective C 中的第一个元素

C 指向数组最后一个元素的指针

listBox c#的第一个元素

仅写入 c++ stl 向量的第一个元素的正确方法

将一个列表中的 8 个元素拆分为另一个 C# 的第一个元素

元组列表到元组 C# 列表中的第一个元素列表

如何使用C++中的指针从数组中删除最后一个元素?

bubbleSort 只对第一个元素进行排序 C++

C:二维数组的大小 - 指针和第一个元素之间的差异