如何为堆栈变量分配内存?

在VS(发布)上,我运行以下命令:

int main(void) { char b[] = "123"; char a[] = "1234567"; printf("%x %x\n", b,a); return 0; } 

我可以看到,a的mem地址是b + 3(字符串的长度)。 这表明内存没有间隙。 这保证了使用最少的记忆。 所以,我现在有点相信所有编译器都会这样做。 我想在这里确定这个猜测。 有人可以给我一个更正式的证据,或者告诉我,我的猜测是根源于巧合。

不,不能保证始终有完美的数据打包。

例如,我在g ++上编译并运行了这段代码,差异是8。

你可以在这里阅读更多相关信息。

tl; dr:编译器可以将内存中的对象与仅可被某些常量整数的地址(总是机器字长)对齐以帮助处理器(对于它们来说,使用这些地址更容易)

UPD:关于对齐的一个有趣例子:

 #include  using namespace std; struct A { int a; char b; int c; char d; }; struct B { int a; int c; char b; char d; }; int main() { cout << sizeof(A) << " " << sizeof(B) << "\n"; } 

对我来说,它打印

 16 12 

无法保证为每个变量选择哪些地址。 例如,不同的处理器可能对变量的对齐具有不同的要求或偏好。

另外,我希望您的示例中的地址之间至少有4个字节。 "123"需要4个字节 – 额外字节用于空终止符。

尝试颠倒声明[]和b []的顺序,和/或增加b的长度。

您正在就如何分配存储做出非常大的假设。 根据您的编译器,字符串文字可能存储在不在堆栈上的文字池中。 然而,[]和b []确实占据了堆栈上的元素。 因此,另一个测试是添加int c并比较这些地址。