加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 如果在循环内声明了一个指针变量,它是否与循环的每次传递都

发布时间:2020-12-16 10:32:41 所属栏目:百科 来源:网络整理
导读:如果你有一个变量,那么就有一个与该变量相关的内存地址,在指针变量的情况下,该内存地址的“值”是对内存地址的引用,该内存地址保存指针指向的实际数据. . 所以,如果我有: for (int x = 0; x 2; x++){ char * a = (char*)malloc(20); printf("%prn",a); pr
如果你有一个变量,那么就有一个与该变量相关的内存地址,在指针变量的情况下,该内存地址的“值”是对内存地址的引用,该内存地址保存指针指向的实际数据. .

所以,如果我有:

for (int x = 0; x < 2; x++)
{
    char * a = (char*)malloc(20);
    printf("%prn",&a);
    printf("%prn",a);
}

输出应该是这样的:

00999999
    04427310
    00999999
    0442ECF0

正如您所看到的,第一个和第三个内存地址对于循环的每次传递期间声明的指针变量保持不变,我的理解是这是因为前一个变量超出范围而下一个可用地址是相同的地址.

这种泛化可以扩展到循环内声明的所有变量,还是有异常?

解决方法

这就是堆栈通常的工作方式.这与变量类型无关.当堆栈向下增长时,它可能看起来或多或少像这样

<top>
|                 |
+-----------------+
| argument1       |
| argument2       |
+-----------------+
| return address  |
+-----------------+
| saved register1 |
| saved register2 |
+-----------------+
| local variable1 | <- base register
| local variable2 |
| x               |
| a               |
|                 | <- stack pointer
<bottom>

编译器将堆栈上的空间分配给相对于某个基址寄存器的每个变量.当循环的范围结束时,有效的空间变得“自由”并且可以重复使用.

如果稍后有第二个循环或某个其他嵌套范围

for (int x = 0; x < 2; x++)
{
    char * a = (char*)malloc(20);
    printf("%prn",a);
}
...
for (int x = 0; x < 2; x++)
{
    char * b = (char*)malloc(20);
    printf("%prn",&b);
    printf("%prn",b);
}

b可能会重复使用之前占用的空间,因为a不再需要它.这完全取决于编译器如何优化堆栈上的空间.

这至少对编译的C类语言有用.当然还有其他的记忆模型.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读