【发布时间】:2015-01-09 23:00:12
【问题描述】:
众所周知,在 C 语言中,堆栈是所有局部变量所在的位置。堆栈是先进后出的数据结构,这意味着您只能访问最近推入它的内容。所以给出以下代码:
int k = 5;
int j = 3;
short int i;
if (k > j) i = 1;
显然这是无用的代码,没有真正的意义,但我正在努力解决一些问题。
对于 short int i 声明,我假设在堆栈上分配了 2 个字节。对于 4 个字节的 int k 和 int j 分配值 5 和 3。因此堆栈如下所示
---------- <- stack pointer
int i
----------
int k = 5
----------
int j = 3
----------
所以对于 if 语句,您必须弹出 int i 才能得到条件 k 和 j,如果是,int i 去哪里?如果这是 C 处理局部变量的方式,这一切似乎非常耗时且乏味。
那么这实际上是 C 的做法还是我把它搞砸了?
【问题讨论】:
-
实际上您在堆栈上的项目布局是错误的,因为 i 是一个短整数,而不是整数。并且堆栈在内存中向下增长,而不是向上增长,并且局部变量以相反的顺序放置在堆栈上。无论如何,本地堆栈上的任何值都不会弹出,而是使用堆栈指针的偏移量,因此引用“k”会导致“从 sp[(偏移量到 k)中读取字(某个寄存器)”类似地用于 'j ' 多变的。并且'i'设置为“从(包含k + j结果的寄存器的下半部分)写入半字sp [偏移量到i]通常您可以将堆栈视为带有分区的长数组
标签: c scope local-variables