函数体内部的大括号离开以后大括号中的定义变量占用的内存会被编译器收回吗

zjtzlqr zjtzlqr 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
#include <stdio.h>

void dayin(int *p,int m)
{
int g = 3;
g++;
printf("%d",*p);
printf("%d",m);

}

int main(void)
{
int *a = NULL;

int b = 1;

if (1 == b)
{
int c = 5;
a = &c;
}

int f = 7;
int g = 9;

dayin(a,g);
}



相应的汇编代码
#include <stdio.h>

void dayin(int *p,int m)
{
00A613B0 push ebp
00A613B1 mov ebp,esp
00A613B3 sub esp,0CCh
00A613B9 push ebx
00A613BA push esi
00A613BB push edi
00A613BC lea edi,[ebp-0CCh]
00A613C2 mov ecx,33h
00A613C7 mov eax,0CCCCCCCCh
00A613CC rep stos dword ptr es:[edi]
int g = 3;
00A613CE mov dword ptr [g],3
g++;
00A613D5 mov eax,dword ptr [g]
00A613D8 add eax,1
00A613DB mov dword ptr [g],eax
printf("%d",*p);
00A613DE mov esi,esp
00A613E0 mov eax,dword ptr [p]
00A613E3 mov ecx,dword ptr [eax]
00A613E5 push ecx
00A613E6 push offset string "%d" (0A6573Ch)
00A613EB call dword ptr [__imp__printf (0A682BCh)]
00A613F1 add esp,8
00A613F4 cmp esi,esp
00A613F6 call @ILT+315(__RTC_CheckEsp) (0A61140h)
printf("%d",m);
00A613FB mov esi,esp
00A613FD mov eax,dword ptr [m]
00A61400 push eax
00A61401 push offset string "%d" (0A6573Ch)
00A61406 call dword ptr [__imp__printf (0A682BCh)]
00A6140C add esp,8
00A6140F cmp esi,esp
00A61411 call @ILT+315(__RTC_CheckEsp) (0A61140h)

}
00A61416 pop edi
00A61417 pop esi
00A61418 pop ebx
00A61419 add esp,0CCh
00A6141F cmp ebp,esp
00A61421 call @ILT+315(__RTC_CheckEsp) (0A61140h)
00A61426 mov esp,ebp
00A61428 pop ebp
00A61429 ret
--- 无源文件 -----------------------------------------------------------------------
00A6142A int 3
00A6142B int 3
00A6142C int 3
00A6142D int 3
00A6142E int 3
00A6142F int 3
00A61430 int 3
00A61431 int 3
00A61432 int 3
00A61433 int 3
00A61434 int 3
00A61435 int 3
00A61436 int 3
00A61437 int 3
00A61438 int 3
00A61439 int 3
00A6143A int 3
00A6143B int 3
00A6143C int 3
00A6143D int 3
00A6143E int 3
00A6143F int 3
00A61440 int 3
00A61441 int 3
00A61442 int 3
00A61443 int 3
00A61444 int 3
00A61445 int 3
00A61446 int 3
00A61447 int 3
00A61448 int 3
00A61449 int 3
00A6144A int 3
00A6144B int 3
00A6144C int 3
00A6144D int 3
00A6144E int 3
00A6144F int 3
--- f:\c++\exercise\exercise\exercise\main.cpp ---------------------------------

int main(void)
{
00A61450 push ebp
00A61451 mov ebp,esp
00A61453 sub esp,0FCh
00A61459 push ebx
00A6145A push esi
00A6145B push edi
00A6145C lea edi,[ebp-0FCh]
00A61462 mov ecx,3Fh
00A61467 mov eax,0CCCCCCCCh
00A6146C rep stos dword ptr es:[edi]
int *a = NULL;
00A6146E mov dword ptr [a],0

int b = 1;
00A61475 mov dword ptr [b],1

if (1 == b)
00A6147C cmp dword ptr [b],1
00A61480 jne main+3Fh (0A6148Fh)
{
int c = 5;
00A61482 mov dword ptr [c],5
a = &c;
00A61489 lea eax,[c]
00A6148C mov dword ptr [a],eax
}

int f = 7;
00A6148F mov dword ptr [f],7
int g = 9;
00A61496 mov dword ptr [g],9

dayin(a,g);
00A6149D mov eax,dword ptr [g]
00A614A0 push eax
00A614A1 mov ecx,dword ptr [a]
00A614A4 push ecx
00A614A5 call dayin (0A610E1h)
00A614AA add esp,8
}
00A614AD xor eax,eax
00A614AF push edx
00A614B0 mov ecx,ebp
00A614B2 push eax
00A614B3 lea edx,[ (0A614D4h)]
00A614B9 call @ILT+130(@_RTC_CheckStackVars@8) (0A61087h)
00A614BE pop eax
00A614BF pop edx
00A614C0 pop edi
00A614C1 pop esi
00A614C2 pop ebx
00A614C3 add esp,0FCh
00A614C9 cmp ebp,esp
00A614CB call @ILT+315(__RTC_CheckEsp) (0A61140h)
00A614D0 mov esp,ebp
00A614D2 pop ebp
00A614D3 ret
00A614D4 db 01h
00A614D5 db 00h
00A614D6 db 00h
00A614D7 db 00h
00A614D8 db dch
00A614D9 db 14h
00A614DA db a6h
00A614DB db 00h
00A614DC db e0h
00A614DD db ffh
00A614DE db ffh
00A614DF db ffh
00A614E0 db 04h
00A614E1 db 00h
00A614E2 db 00h
00A614E3 db 00h
00A614E4 db e8h
00A614E5 db 14h
00A614E6 db a6h
00A614E7 db 00h
00A614E8 db 63h
00A614E9 db 00h



两个问题
1:
printf("%d",*p);
00A613DE mov esi,esp
00A613E0 mov eax,dword ptr [p]
00A613E3 mov ecx,dword ptr [eax]
00A613E5 push ecx
00A613E6 push offset string "%d" (0A6573Ch)
00A613EB call dword ptr [__imp__printf (0A682BCh)]
00A613F1 add esp,8
00A613F4 cmp esi,esp
00A613F6 call @ILT+315(__RTC_CheckEsp) (0A61140h)



00A613E0 mov eax,dword ptr [p]

网上都说mov eax,dword ptr [p]的意思是把把p指向的内容复制给寄存器eax,为什么实际执行了这句话的结果只是把p这个地址复制给寄存器
而下面同样的汇编00A613E3 mov ecx,dword ptr [eax] 却是把eax寄存器指向的内容也就是5复制给寄存器eax


问题2、为什么
if (1 == b)
{
int c = 5;
a = &c;
}

大括号中定义的变量c在离开}符号以后c占用的内存会被编译器收回吗? 一个函数中离开函数体会收回。不知道函数体中包含的某个大括号是不是也是这样









...全文

相关推荐

C语言中变量定义的位置

C++中,变量定义可以在函数中的任意位置,比如函数中任意位置出现的For循环中: for(int i = 0; i&lt; len; i++) {     /*do something;*/ }   变量i可以在使用到的地方才给定义;   然而在C语言中,变量的定义一定要在函数体的开始处;   否则在使用到变量的地方才定义,编译的时候会报不认识此变量,如下这个屏幕字段入口函数: Fi_120015_01_CICUSENA() {         char acRegFlg[2];         GetStr("K_C00101",acRegFlg);       

weixin_38612568

深入探讨C语言中局部变量与全局变量在内存中的存放位置

本篇文章是对在C语言中局部变量与全局变量在内存中的存放位置进行了详细的分析介绍,需要的朋友参考下

weixin_38563871

C++循环变量定义生命周期

C++与C的一个大的不同的是C要求所有变量要在开始的声明,而C++的变量是信手拈来,想用才声明。这个简单的细节其实隐含了C与C++的设计逻辑有所区别。   C设计的时候其实更多是为编译器考虑问题,当所有变量在使用之前声明的话,编译器更容易处理这些变量。在开始的时候把他们都写入符号表中,在程序执行的时候直接查看符号表即可。然而C++设计的时候对安全性特别关注,对于类,它是有构造与析构处理的。而构造函数有时是需要参数,我们在程序的开始其实我们不一定很清楚参数的值。这要求变量的声明不能只放在函数的开始,而是能够做到使用时再声明,C++也的确做到这一点。   这个使用时才声明是极其方便,我们常

weixin_38698403

编译器说 Lambda 表达式中的变量必须是 final 的,我偏不信

偶尔,我们需要在 Lambda 表达式中修改变量的值,但如果直接尝试修改的话,编译器不会视而不见听而不闻,它会警告我们说:“variable used in lambda expression should be final or effectively final”。 这个问题发生的原因是因为 Java 规范中是这样规定的: Any local variable, formal parameter, or exception parameter used but not declared in a lambda expression must either be declared fina

weixin_38651286

到底一个线程占用多少内存

线程占用多少内存

lj_70596
评论 18
收藏 已收藏
分享
返回顶部
zjtzlqr
C语言 70,039 成员 243,237 内容