“如何”的规则是什么;“关闭”;如果有的话,每个变量都存储在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;