局部变量问题,不知道有没有人问过

cctime 2007-11-26 11:03:33
while (1) {
int t; //局部变量是在堆栈中分配,这个分配动作是每次循环做,还是只做一次?
}
...全文
155 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
mu_yang 2007-12-19
  • 打赏
  • 举报
回复
从起肯定不行,系统都没有了!呵呵!
=============================
呵呵
同感
喷饭
mymtom 2007-11-29
  • 打赏
  • 举报
回复
输出结果是:
j = 672364734
&j = BFBFEC1C
j = 17
&j = BFBFEC20
j = 672364735
&j = BFBFEC1C
j = 18
&j = BFBFEC20
j = 672364736
&j = BFBFEC1C
j = 19
&j = BFBFEC20
j = 672364737
&j = BFBFEC1C
j = 20
&j = BFBFEC20
j = 672364738
&j = BFBFEC1C
j = 21
&j = BFBFEC20
mymtom 2007-11-29
  • 打赏
  • 举报
回复
每次都进行的!
#include <stdio.h>

int main(void)
{
int i;

for (i = 0; i < 10; i++)
{
if (i % 2)
{
int j;
j++;
printf(" j = %d\n", j);
printf("&j = %08zX\n", &j);
}
else
{
int k;
int j;
j++;
printf(" j = %d\n", j);
printf("&j = %08zX\n", &j);
}
}
return 0;
}
cctime 2007-11-29
  • 打赏
  • 举报
回复
//测试:WINXP, VC++ 5.0
class T {
public:
T(){
printf("T()\r\n");
}
~T(){
printf("~T()\r\n");
}
};

int main(int argc, char* argv[])
{
printf("Hello World!\n");

for (int i = 0; i < 5; i++){
T t;
}

return 0;
}

//结果: 5次构造销毁, 内存空间分配情况不知道(可能是分配5次)
//对纯c情况的内存分配不知道
//gcc/g++情况不知道

pptor 2007-11-26
  • 打赏
  • 举报
回复
每次都分配,出了while的{}就自动销毁
thecorr 2007-11-26
  • 打赏
  • 举报
回复
应该是每次分配的
_石头_ 2007-11-26
  • 打赏
  • 举报
回复
void fun()
{
for(;;)
{
...
while (flag)
{
int t; //每次进入fun()函数时分配int t,他的作用域在while{}内。
}
}
}
loops 2007-11-26
  • 打赏
  • 举报
回复
int t; //局部变量是在堆栈中分配,这个分配动作是每次循环做,还是只做一次?
~~~~~~~~~
只做一次,在函数开头早已做好。如果t是带构造函数的对象,则每次都会调用构造和析构函数。
suyouxin 2007-11-26
  • 打赏
  • 举报
回复
理论上是进while的时候分一个int在栈上。出while的时候出栈

不过不同的编译器可能处理不一样

windows进函数时都会分配一个栈帧的大小,可能比实际需要用到的大得多
baihacker 2007-11-26
  • 打赏
  • 举报
回复
一进函数就分配了...
只是使用域在{}内
分配就是把ebp入栈,esp减一个值和某个偏移...
如果每次都分配,烦不烦啊...
{
004115F0 push ebp
004115F1 mov ebp,esp
004115F3 sub esp,0D8h
004115F9 push ebx
004115FA push esi
004115FB push edi
004115FC lea edi,[ebp-0D8h]
00411602 mov ecx,36h
00411607 mov eax,0CCCCCCCCh
0041160C rep stos dword ptr es:[edi]
for (int i = 0; i < 10; i++)
0041160E mov dword ptr [i],0
00411615 jmp main+30h (411620h)
00411617 mov eax,dword ptr [i]
0041161A add eax,1
0041161D mov dword ptr [i],eax
00411620 cmp dword ptr [i],0Ah
00411624 jge main+3Fh (41162Fh)
{
int t;
t = 1;
00411626 mov dword ptr [t],1
}
0041162D jmp main+27h (411617h)
baihacker 2007-11-26
  • 打赏
  • 举报
回复
一进函数就分配了...
只是使用域在{}内
分配就是把ebp入栈,esp减一个值 和 40h的偏移...
如果每次都分配,烦不烦啊...
{
004115F0 push ebp
004115F1 mov ebp,esp
004115F3 sub esp,0D8h
004115F9 push ebx
004115FA push esi
004115FB push edi
004115FC lea edi,[ebp-0D8h]
00411602 mov ecx,36h
00411607 mov eax,0CCCCCCCCh
0041160C rep stos dword ptr es:[edi]
for (int i = 0; i < 10; i++)
0041160E mov dword ptr [i],0
00411615 jmp main+30h (411620h)
00411617 mov eax,dword ptr [i]
0041161A add eax,1
0041161D mov dword ptr [i],eax
00411620 cmp dword ptr [i],0Ah
00411624 jge main+3Fh (41162Fh)
{
int t;
t = 1;
00411626 mov dword ptr [t],1
}
0041162D jmp main+27h (411617h)
xugang_2001 2007-11-26
  • 打赏
  • 举报
回复
每次都分配,出了函数就自动销毁
ckt 2007-11-26
  • 打赏
  • 举报
回复
每次都会分配
t的作用域只在while内
_石头_ 2007-11-26
  • 打赏
  • 举报
回复
从起肯定不行,系统都没有了!呵呵!
大量数据?那得要多少啊?windows系统在内存不够的时候会把一些进程临时停掉,将相应的数据备份到硬盘的虚拟内存里!等系统可以处理了就另行开辟内存,然后将数据倒入行开辟的内存里------此时大多数数据的地址都变动了!不仅仅是一个函数的临时变量!
xiyouhouji 2007-11-26
  • 打赏
  • 举报
回复
恩 结果和理论有出入。是因为计算机的缓存在“作怪”(具体是一级还是二级,我忘了),
也就是说计算机为了快速的读取数据,会记录下这次数据在栈中的地址。
这样打个比喻吧:
我们去读图书管看书,这个图书馆就相当于一个内存,我们先拿了一本书找了个位子坐了下来,
然后翻了一下,我们就再去书柜去换另一本书来看,当我们起身离开我们的座位时,这个座位就
不是我们占有的了。刚才在我们临座看书的,她完全可以到我们的位子来坐。或者说图书馆里的人
都有这个权利,在某个位子坐几分钟,然后又跑到没人的位子上坐坐。但我们知道,约定俗成加上
为了给图书馆营造和谐安静的气氛,我们选定了位子我们就很少再换了的,即使我们离座一小会,并且
没有申明那个位子就是我们的,我们等会还是回到原来的位子。
当然,有好几种情况例外,比如说,图书馆关门了等下次再来,或者人流动性比较大,我们再来看
看,那几乎是原来位子上的那悚已经不是那悚。
为了这个例子,我分别进行了重起机子,和进行大量(小量的不成功)的数据操作后,发现这两种情
况下的结果是temp1 和temp2以及arr_a, arr_b它们的地址是改变了的。当然书本上说得没错:每次都
分配,出了作用域就销毁了。只是觉得软件理论上的运行,和在计算机上真实的运行原理还是有些出入的。
由于现代计算机的复杂性以及融入了越来越多的技术,一些理论是否也要修改或者作一些特别的说明呢?

moonmonkey 2007-11-26
  • 打赏
  • 举报
回复
。。。。。。试试
_石头_ 2007-11-26
  • 打赏
  • 举报
回复
~~我是这么学的
------------------------------
不怪你,我们的教授们都是这么教的!....哎!运行一下下面的代码看看!结果显示temp1和temp2的地址根本就没有改变过!

#include <stdio.h>
#include <windows.h>
int main()
{
int *p=NULL;
int i,t=0;
for (i=0;i<5;i++)
{
int arr_b[10];
printf("\n\nCycle=%d\n",i+1);
while(t<5)
{
int temp1; //如果每次while()循环结束 temp就销毁的话,那temp的地址肯定至少不会完全相同
printf("&temp1=%#x ",&temp1);
t++;
}
t=0;
printf("\n");
while(t<5)
{
int temp2; //这个也一样
printf("&temp2=%#x ",&temp2);
t++;
}
t=0;
int arr_a[10];
printf("\n arr_a=%#x, arr_b=%#x \n\n",arr_a, arr_b);
}
return 0;
}
cqpp 2007-11-26
  • 打赏
  • 举报
回复
绝对是只分配一次
moonmonkey 2007-11-26
  • 打赏
  • 举报
回复
每次都分配,出了作用域就销毁了~~我是这么学的=。=

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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