我最近一直在学习C语言,而且我遇到了一些我似乎无法找到答案的方法。
在我的代码中,我可能会:
struct randomStruct a;
struct secondStruct array[5];
struct structyStruct q = { 17, "Hey yo", {123,123}};
但在内存中,它们可能存储为:
q, a, array
我的意思是,q在内存中的地址低于a,低于数组的地址。
是什么决定了变量在内存中保存的顺序?
(如果您需要更多信息/实际可运行代码,请告诉我们)
提前致谢!
答案 0 :(得分:4)
您所看到的是the direction of the stack growth发生的事情。
标准对自动变量的地址没有任何说明。因此,不需要存在变量地址之间的关系。
答案 1 :(得分:2)
C标准指定结构中项目的内存顺序,并且许多(可能是所有)实现显式指定了可变参数函数的参数的内存顺序,但自动和静态变量的顺序应该被视为编译器的内容可以任意或随意安排,没有押韵或理由。许多编译器使用哈希表作为标识符,并且至少一些编译器会根据哈希代码排列变量,这使得变量放置有效地随机。
此外,某些处理器的设计使某些变量放置比其他放置更快。例如,某个微控制器的编译器可以确定将两个变量放在彼此的256个字节内将允许它将一个地址加载到一个寄存器中,然后使用短位移寄存器相对寻址来访问两者;即使今天的编译器不会进行优化,也没有理由相信明天不会。
如果您关心内存中变量的相对排列,那么您必须以特定于供应商的方式标记变量(通常使用#pragma指令)来控制它们在内存中的放置方式,或者放置所有变量对结构感兴趣。在某些情况下,使用#define宏来允许结构项看起来像变量名称可能会有所帮助;这样做的最大警告是#define宏不遵守任何正常的范围规则;因此,必须确保“变量”名称不会在程序中的任何位置用作任何类型的标识符。
答案 2 :(得分:2)
在C语言中,单独的对象(即不属于同一结构或数组的对象)在内存中没有顺序。指针的比较和减法仅针对公共数组元素的指针定义。
答案 3 :(得分:1)
所有这些项都在堆栈中声明,这就是你看到这个的原因。
在堆栈上查看wiki。
http://en.wikipedia.org/wiki/Stack_(abstract_data_type)
然后在内存布局上查看此内容。应该回答你的问题。
http://discussknowhow.blogspot.com/2008/08/memory-layout-of-c-program-stack-wise.html