变量如何存储在堆栈中

时间:2016-06-16 17:13:20

标签: c memory memory-management stack gdb

由于我知道在创建这个程序时堆栈是一个FILO段(First In Last Out),如下所示,我认为auth_flag vairable存储在password_buffer变量之后:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int check_authentication(char *password) {
int auth_flag = 0;
char password_buffer[16];   
...
}

int main(int argc, char *argv[]) {
....
}

当我在gdb中检查auth_flag和password_buffer的位置时,我确实看到auth_flag在password_buffer之后是28个字节:

(gdb) x/s password_buffer
0x7fffffffe3f0: "\001"
(gdb) x/xw &auth_flag
0x7fffffffe40c: 0x00000000
(gdb) # now let's print how many bytes is auth_flag away from      password_buffer
(gdb) print 0x7fffffffe40c - 0x7fffffffe3f0
$3 = 28
(gdb) # so auth_flag is 28 bytes after password_buffer

在反转变量声明之后,我希望在auth_flag之后存储password_buffer:

int check_authentication(char *password) {
char password_buffer[16];
int auth_flag = 0;    
...
}

然而,事实并非如此,因为使用gdb进行实验会产生相同的结果。这怎么可能?不应该在password_buffer之前使用auth_flag吗?

1 个答案:

答案 0 :(得分:7)

即使变量(通常)被放入堆栈然后运行该函数,编译器也可以按任何顺序将它们放在那里。开发人员通常没有理由关心订单,而编译器更清楚地了解它们应该以何种顺序进行优化。

如果您关心订单,可以使用struct,编译器不会重新排序。

另外如果我没记错,C标准甚至不需要堆栈存在,变量可以在任何地方。