据我所知,结构元素存储在连续的存储单元中。为了确认这一点,我在下面的示例应用程序中进行了编写。
#include <stdio.h>
struct Employee{
char firstName;
float salary;
int id;
};
int main(){
struct Employee emp = {'K', 123456.78, 1};
printf("firstName stored at location : %lu\n", &emp.firstName);
printf("salary stored at location : %lu\n", &emp.salary);
printf("id stored at location : %lu\n", &emp.id);
return 0;
}
运行该应用程序时,我看到下面的输出。
firstName stored at location : 140732780083504
salary stored at location : 140732780083508
id stored at location : 140732780083512
正如您所看到的输出,firstName存储在位置140732780083504,薪水存储在位置140732780083508,薪水不能在140732780083505吗?这样的行为是否总是返回特定变量的结束位置?
答案 0 :(得分:2)
这可能是由于padding bytes造成的。正如您所说,结构确实存储在连续的内存位置中,但是,编译器可以随意在元素之间添加填充字节,无论它们选择什么,它们都会这样做,以使字段与体系结构自然对齐。通常,只有自然对齐的由多个字节组成的单词才能由单个指令访问。
答案 1 :(得分:1)
发生这种情况是因为编译器的默认结构填充为4个字节。
如果您希望结构元素在内存中一个接一个地使用,请使用#pragma pack(push, 1)
此外,这篇文章对于理解结构填充也很有用:Structure padding and packing