c++中循环中的局部变量的地址为什么一直都不变

N798588567 2014-06-27 01:00:22
for(int i=0;i<10;i++) {
int j = i+1;
cout<<&j<<endl;
}

每一次循环,j的地址值都是一个,不是每一次循环的时候都会重新自动分配吗?为啥每次都是同一个地址呢?

新手求教

...全文
795 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
Sandrer 2014-06-28
  • 打赏
  • 举报
回复
编译优化而已, 楼主别想太多了
zilaishuichina 2014-06-27
  • 打赏
  • 举报
回复
引用 14 楼 N798588567 的回复:
int *p[10]; int values[10]; for(int i=0;i<10;i++) { int j = i+1; values[i] = j; p[i] = &values[i] } 上面代码少了点,是这个
但是lz 你用一个指针指向了一个局部变量的地址, 然后你想那这个指针干啥。既然你有了int values[10]了,为什么你还需要int *p[10]呢
N798588567 2014-06-27
  • 打赏
  • 举报
回复
int *p[10]; int values[10]; for(int i=0;i<10;i++) { int j = i+1; values[i] = j; p[i] = &values[i] } 上面代码少了点,是这个
N798588567 2014-06-27
  • 打赏
  • 举报
回复
非常感谢各位的回复,其实这个问题来源于我用一个指针数组,然后,这个数组里面存了一个地址,只是经过循环处理后,所有的都指向一个地址,有此而来的一个问题,如下代码: int *p[10]; for(int i=0;i<10;i++) { int j = i+1; p[i] = &j; cout<<&j<<endl; } 所以这样一来我就感觉怪怪的,我每次做类似操作指针数组的时候还不得不有一个非指针数组来转一下,如下 int *p[10]; int values[10]; for(int i=0;i<10;i++) { int j = i+1; values[i] = j; p[i] = &values } 然后,这样指针数组里面的指针就不会指向一个地址了,感觉很怪异。。。
FrankHB1989 2014-06-27
  • 打赏
  • 举报
回复
虽然是不同的对象,但即便存储期有重叠,生存期也不会有,换句话说你不会有正确地&a == &b来验证不同完整对象地址不一样的机会,所以实现自然有权复用同样的存储。 从实现的角度来说,这种静态能确定生存期和大小的玩意儿再栈帧上另外多分配显然是无用功。
zilaishuichina 2014-06-27
  • 打赏
  • 举报
回复
首先 栈上的内存是顺序分配的, pop出来,再push进去。还是在原来的位置。 其次 j是作用域在for循环以内,出了for循环你只是用不了了,不代表出了for循环j就销毁了,是否销毁这个要看编译器的。 VS2010的结果

int i = 0;
	int *p = NULL;
	for(i=0;i<10;i++) 
	{
		int j = i+1;
		p = &j;
	}

	for(i=10;i<20;i++) 
	{
		int j = i+1; 
		// 这个j和上面的j不是同一个地址。
		// 说明上面那个j的空间依然存在,没有被重新利用
	}

	printf("%d", *p); 
	//此时打印10,同样说明第一个j的空间里面的值没有被更改。
yangyunzhao 2014-06-27
  • 打赏
  • 举报
回复
看汇编就晓得了
Binzo 2014-06-27
  • 打赏
  • 举报
回复
我个人的理解: 在栈上分配,局部变量在进“{”,出“}”时会分别被分配和被释放,对应于压栈和出栈,所以很容易总是一样的。
mujiok2003 2014-06-27
  • 打赏
  • 举报
回复
{}每次都会进入一个新的块作用域, 跟内存分配是没有关系的。 栈上的局部变量会自动分配和释放。自动意味着不受程序员干预, 如何分配释放也是不一定的。
mujiok2003 2014-06-27
  • 打赏
  • 举报
回复
引用
,不是每一次循环的时候都会重新自动分配吗?为啥每次都是同一个地址呢?
一般不是重新分配的。
阳光_八月 2014-06-27
  • 打赏
  • 举报
回复
引用 4 楼 zhuyf87 的回复:
不是每一次循环的时候都会重新自动分配吗?为啥每次都是同一个地址呢? 这两件事不冲突吧,变量销毁之后,原来的位置又空出来了。
虽然不冲突,可是也不会每次都轮到这个位置啦,是不是有内存里面也分优先级。
你怎么了熊吉 2014-06-27
  • 打赏
  • 举报
回复
简单地说,就是编译器选择这么做,但标准并不规定如此
N798588567 2014-06-27
  • 打赏
  • 举报
回复
引用 18 楼 zilaishuichina 的回复:
[quote=引用 16 楼 N798588567 的回复:] [quote=引用 15 楼 zilaishuichina 的回复:] 但是lz 你用一个指针指向了一个局部变量的地址, 然后你想那这个指针干啥。既然你有了int values[10]了,为什么你还需要int *p[10]呢
这刚好就是我的问题了,我只要int *p[10],为啥我不得不要一个 int values[10]呢? [/quote] 但是问题是 你为什么要定义成int *p[10], 能不能定义成别的。也许 int values[10]才是应该要的呢? 显然,你预期的是想要存储10个int *,也就是你有10个指针要存。 但是你的for循环里面只有两个 不同的变量,i,j。最多也就两个不同地址。哪来的10个地址呢。并不是一个地址你循环10次就变成10个地址了。 所以lz你得告诉大家,你定义了一个int *p[10],这个int *p[10]你是用来干什么的。你告诉大家你想做什么,大家才能给你建议可以怎么做,怎么做比较好,怎么做不会觉得别扭。 也有可能在你的需求中,其实是不需要定义成int *p[10]的呢?[/quote] 谢谢,其实也只是做个测试,测试指针的特性,呵呵,我是从事java开发,最近有兴趣在研究C++语言,同时也是为了对比,比较两种语言的差异性,也是为了更好的理解 从上面大家的回答我已经知道我要的答案,在这里非常感谢大家的回复!
zhuyf87 2014-06-27
  • 打赏
  • 举报
回复
不是每一次循环的时候都会重新自动分配吗?为啥每次都是同一个地址呢? 这两件事不冲突吧,变量销毁之后,原来的位置又空出来了。
赵4老师 2014-06-27
  • 打赏
  • 举报
回复
void fun(int lv) {
    if (0==lv) return;
    fun(lv-1);
}

for(int i=0;i<10;i++) {
    fun(i);
int j = i+1;
cout<<&j<<endl;
}
zilaishuichina 2014-06-27
  • 打赏
  • 举报
回复
引用 16 楼 N798588567 的回复:
[quote=引用 15 楼 zilaishuichina 的回复:] 但是lz 你用一个指针指向了一个局部变量的地址, 然后你想那这个指针干啥。既然你有了int values[10]了,为什么你还需要int *p[10]呢
这刚好就是我的问题了,我只要int *p[10],为啥我不得不要一个 int values[10]呢? [/quote] 但是问题是 你为什么要定义成int *p[10], 能不能定义成别的。也许 int values[10]才是应该要的呢? 显然,你预期的是想要存储10个int *,也就是你有10个指针要存。 但是你的for循环里面只有两个 不同的变量,i,j。最多也就两个不同地址。哪来的10个地址呢。并不是一个地址你循环10次就变成10个地址了。 所以lz你得告诉大家,你定义了一个int *p[10],这个int *p[10]你是用来干什么的。你告诉大家你想做什么,大家才能给你建议可以怎么做,怎么做比较好,怎么做不会觉得别扭。 也有可能在你的需求中,其实是不需要定义成int *p[10]的呢?
www_adintr_com 2014-06-27
  • 打赏
  • 举报
回复
所有的局部变量和函数参数都是在进入函数的时候就分配好,退出函数的时候才释放,不存在函数中分配局部变量的问题,所谓的作用域只是 C++ 语法对标示符范围的限制。
N798588567 2014-06-27
  • 打赏
  • 举报
回复
引用 15 楼 zilaishuichina 的回复:
但是lz 你用一个指针指向了一个局部变量的地址, 然后你想那这个指针干啥。既然你有了int values[10]了,为什么你还需要int *p[10]呢
这刚好就是我的问题了,我只要int *p[10],为啥我不得不要一个 int values[10]呢?
brookmill 2014-06-27
  • 打赏
  • 举报
回复
从编译器的角度来说,j的地址相对于栈指针的偏移量是固定的,不然就没法生成汇编代码了。 for(int i=0;i<10;i++) { int j = 1234; // gcc生成的汇编是: movl $1234, 8(%esp) } 从汇编可以看出,j的地址就是栈指针加上8个字节,和循环没关系。
brookmill 2014-06-27
  • 打赏
  • 举报
回复
个人意见:就地址分配来说,下面的i,j, k都是一样的,都只分配一个地址,唯一的区别是可见范围 int k; for(int i=0;i<10;i++) { int j = i+1; } 局部变量是分配在栈上,地址是栈指针的一个偏移量。栈就那么大,不可能循环一万次就给分配一万个地址。反正上次循环和下次循环也不冲突,上次用完了下次接着用。
加载更多回复(1)

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧