如果你有一个变量,那么就有一个与该变量相关的内存地址,而在一个指针变量的情况下,该内存地址的“值”是对内存地址的引用,该内存地址保存了实际的数据。指针指向。
所以,如果我有:
for (int x = 0; x < 2; x++)
{
char * a = (char*)malloc(20);
printf("%p\r\n", &a);
printf("%p\r\n", a);
}
输出应该是这样的:
00999999
04427310
00999999
0442ECF0
正如你所看到的,第一个和第三个内存地址对于循环每次传递期间声明的指针变量保持不变,我的理解是这是因为前一个变量超出范围而下一个变量可用地址是相同的地址。
这种泛化能否扩展到循环内声明的所有变量,还是有异常?
答案 0 :(得分:10)
不,你不能概括这一点,并且不能保证a
(指针,而不是它指向的内容)的内存在每次迭代时都是相同的。在这种情况下,内存被重用,它可能总是相同,但无法保证。
另请注意,您有内存泄漏。
答案 1 :(得分:3)
这就是堆栈通常的工作方式。这与变量类型无关。当堆栈向下增长时,它可能看起来或多或少像这样
<top>
| |
+-----------------+
| argument1 |
| argument2 |
+-----------------+
| return address |
+-----------------+
| saved register1 |
| saved register2 |
+-----------------+
| local variable1 | <- base register
| local variable2 |
| x |
| a |
| | <- stack pointer
<bottom>
编译器将堆栈空间分配给相对于某个基址寄存器的每个变量。当循环的范围结束时,a
的空间实际上变为“空闲”并且可以重复使用。
如果稍后有第二个循环或某个其他嵌套范围
for (int x = 0; x < 2; x++)
{
char * a = (char*)malloc(20);
printf("%p\r\n", &a);
printf("%p\r\n", a);
}
...
for (int x = 0; x < 2; x++)
{
char * b = (char*)malloc(20);
printf("%p\r\n", &b);
printf("%p\r\n", b);
}
b
可能会重复使用a
之前占用的空间,因为不再需要它。这完全取决于编译器如何优化堆栈空间。
这至少对编译的C类语言有用。当然还有其他的记忆模型。