c - 为什么 &second_variable 的地址比 &first_variable 高?
问题描述
我有以下代码
int main(int argc, char *argv[]) {
int value1 = 10;
int value2 = 11;
return 0;
}
当我调试代码时,&value2 高于 &value1。这意味着 value2 首先被压入堆栈,然后是 value1。
这是 gcc 的正常行为吗?
为什么 gcc 自下而上编译变量?
clang 是否也有同样的行为?
谢谢
解决方案
堆栈上局部变量的顺序完全依赖于实现,不需要看起来一致。
当用 gcc 4.8.5 编译上面的代码并运行它时,它value1
的地址比value2
你看到的要高。
我也尝试在 gdb 中运行它:
int main(int argc, char *argv[]) {
int value1 = 10;
int x = 4;
int value2 = 11;
printf("&1=%p, &2=%p\n", &value1, &value2);
return 0;
}
得到了这个:
(gdb) start
Temporary breakpoint 1 at 0x40053c: file x1.c, line 6.
Starting program: /home/dbush/./x1
Temporary breakpoint 1, main (argc=1, argv=0x7fffffffe008) at x1.c:6
6 int value1 = 10;
Missing separate debuginfos, use: debuginfo-install glibc-2.17-196.el7.x86_64
(gdb) step
7 int x = 4;
(gdb)
8 int value2 = 11;
(gdb)
10 printf("&1=%p, &2=%p\n", &value1, &value2);
(gdb) p &value1
$1 = (int *) 0x7fffffffdf18
(gdb) p &value2
$2 = (int *) 0x7fffffffdf14
(gdb) p &x
$3 = (int *) 0x7fffffffdf1c
(gdb)
在这种情况下,地址位于x
之后value1
,value2
即使它是在它们之间定义的。
这表明您不能对堆栈中变量的顺序做出任何假设。
推荐阅读
- swift - 为什么我的 MKAnnotationView 没有显示?- 斯威夫特
- python - mondodb 拒绝了具有 srv 远程连接的 Python Montor asyncio
- python - 列表理解干扰了递归
- android - Android - 解析网页内容
- php - CakePHP v2.10.20 控制台“Mysql”丢失...“所选驱动程序未启用”
- python - Python - 初学者帮助 - 如何将多个值附加到列表中?
- javascript - NodeJS 创建 docx 文件的图像预览
- django - 替换整个 Django 管理模板
- mysql - 安装 MySQL 后无法在 Mac 终端运行基本命令
- angular - Angular 跨字段验证和自定义验证一起使用