“如何”的规则是什么;“关闭”;如果有的话,每个变量都存储在C中?

“如何”的规则是什么;“关闭”;如果有的话,每个变量都存储在C中?,c,memory,C,Memory,我知道对于一个结构来说 struct sequences{ int a[3]; int b[3]; } sequence = {{1,2,3},{4,5,6}}; a和b彼此相邻存储,即如果我这样做 int i; for(i=0; i<6; ++i){ printf("%d", sequence.a[i]); } 当我尝试同样的事情时 for(i=0; i<6; ++i){ sum = sum + a[i]; } 及 fo

我知道对于一个结构来说

struct sequences{
    int a[3];
    int b[3];
} sequence = {{1,2,3},{4,5,6}};
a和b彼此相邻存储,即如果我这样做

int i;
for(i=0; i<6; ++i){
    printf("%d", sequence.a[i]);
}
当我尝试同样的事情时

    for(i=0; i<6; ++i){
        sum = sum + a[i];
    }


for(i=0;iC标准只保证结构的非位字段成员在内存中顺序存储,元素之间有可选的填充,数组的成员顺序存储,没有填充

关于结构,第6.7.2.1p15节规定:

在结构对象中,非位字段成员和 位字段所在的单元的地址增加 声明它们的顺序。指向结构的指针 对象(经过适当转换)指向其初始成员(或 如果该成员是位字段,则指向它所在的单元 中可能有未命名的填充 结构对象,但不在其开头

对于内存中一个不相关变量与另一个不相关变量的放置,没有保证

此外,执行此操作时:

struct sequences{
    int a[3];
    int b[3];
} sequence = {{1,2,3},{4,5,6}};
...

int i;
for(i=0; i<6; ++i){
    printf("%d", sequence.a[i]);
}
结构序列{ int a[3]; int b[3]; }序列={1,2,3},{4,5,6}; ... int i;
对于(i=0;i序列
a
b
的元素必须是连续的。此外
a
的第一个元素的地址必须与
结构的实例的地址相同

实现可以在
a
b
之间以及
b
之后添加填充

您不能使用指针算法来确定
a
b
之间是否没有填充:指针算法的行为仅在arrays中定义。因此,运行
i
最多5次的代码的行为是未定义的,因此您无法将其用于任何可靠的目的

因为将指针设置为数组(或对象,但在此处不相关)之外的指针是合法的,所以表达式
(void*)(&a+1)
是有效的,因此可以使用测试

(void*)(&a + 1) == (void*)&b;

要测试
a
b
(Acknowledge@EricPostpischil。)

的连续性或其他方面,如果存在这样的保证,有什么用?您应该知道
a
b
结构序列中可能存在差距,即使没有,也可以访问
a[3]
a[6]
具有未定义的行为。因此,数组和整数(如我的示例中所示)似乎总是相邻存储这一事实纯属巧合?这样存储它们是否有效?@是的,这是巧合。如果要在同一范围内添加其他变量或更改优化设置,排序可能会降低lly change.Re:“您不能使用指针算法来确定”
(void*)(&a+1)==(void*)和b
之间是否没有空格,这在C中是一个有效的表达式,当且仅当地址空间中的
b
恰好紧跟在
a
之后时(C 2018 6.5.9 6)。
    for(i=0; i<4; ++i){
        printf("%d", a[i]);
    }
struct sequences{
    int a[3];
    int b[3];
} sequence = {{1,2,3},{4,5,6}};
...

int i;
for(i=0; i<6; ++i){
    printf("%d", sequence.a[i]);
}
(void*)(&a + 1) == (void*)&b;