由于我知道在创建这个程序时堆栈是一个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吗?
答案 0 :(得分:7)
即使变量(通常)被放入堆栈然后运行该函数,编译器也可以按任何顺序将它们放在那里。开发人员通常没有理由关心订单,而编译器更清楚地了解它们应该以何种顺序进行优化。
如果您关心订单,可以使用struct
,编译器不会重新排序。
另外如果我没记错,C标准甚至不需要堆栈存在,变量可以在任何地方。