c语言中何时分配内存的问题

造句大全 2008-07-23 04:23:29
在c语言中,
int main()
{
int a;//(1)
a = 12;//(2)

.....
}

在上面的语言中,变量a在内存中的空间是在1后分配呢还是在2以后分配呢?


void fun_1(void);//(1)
int main()
{
.....
fun_1();//(2)

}

void fun_1(void)//(3)
{
....
}


对于这种,函数fun_1在内存中的空间是在1、2、3处的何处分配的呢???



谢谢!!!
...全文
166 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
ForestDB 2008-07-23
  • 打赏
  • 举报
回复
在进入{和(的时候。
Darkneece 2008-07-23
  • 打赏
  • 举报
回复
4:    int main()
5: {
00401010 push ebp
00401011 mov ebp,esp
00401013 sub esp,44h //分配栈内存
00401016 push ebx
00401017 push esi
00401018 push edi
00401019 lea edi,[ebp-44h]
0040101C mov ecx,11h
00401021 mov eax,0CCCCCCCCh
00401026 rep stos dword ptr [edi]
6: int a;//(1)
7: a = 12;//(2)
00401028 mov dword ptr [ebp-4],0Ch
8:
9: return 0;
0040102F xor eax,eax
10: }

重帖第一个
Darkneece 2008-07-23
  • 打赏
  • 举报
回复
4:    int main()
5: {
00401010 push ebp
00401011 mov ebp,esp
00401013 sub esp,44h
00401016 push ebx
00401017 push esi
00401018 push edi
00401019 lea edi,[ebp-44h]
0040101C mov ecx,11h
00401021 mov eax,0CCCCCCCCh
00401026 rep stos dword ptr [edi]
6: int a;//(1)
7: a = 12;//(2)
00401028 mov dword ptr [ebp-4],0Ch
8:
9: return 0;
0040102F xor eax,eax
10: }

看红字,分配栈内存

4:    void fun_1(void);//(1)
5:
6: int main()
7: {
00401010 push ebp
00401011 mov ebp,esp
00401013 sub esp,40h
00401016 push ebx
00401017 push esi
00401018 push edi
00401019 lea edi,[ebp-40h]
0040101C mov ecx,10h
00401021 mov eax,0CCCCCCCCh
00401026 rep stos dword ptr [edi]
8: fun_1();//(2)
00401028 call @ILT+5(fun_1) (0040100a)
9: return 0;
0040102D xor eax,eax
10: }



12:   void fun_1(void)//(3)
13: {
0040D3F0 push ebp
0040D3F1 mov ebp,esp
0040D3F3 sub esp,44h
0040D3F6 push ebx
0040D3F7 push esi
0040D3F8 push edi
0040D3F9 lea edi,[ebp-44h]
0040D3FC mov ecx,11h
0040D401 mov eax,0CCCCCCCCh
0040D406 rep stos dword ptr [edi]
14: int a;
15: }

一目了然
lunarfan 2008-07-23
  • 打赏
  • 举报
回复
定义时分配1、(1)2、(3)
胖爸爸 2008-07-23
  • 打赏
  • 举报
回复
贴个例子:
int fun (int i);

int main ()
{
int i=1;
fun(i);
}

int fun (int i)
{
return i;
}

汇编:
00401001   int         3
00401002 int 3
00401003 int 3
00401004 int 3
@ILT+0(_fun):
00401005 jmp fun (00401070)
@ILT+5(_main):
0040100A jmp main (00401020)
0040100F int 3
00401010 int 3
00401011 int 3
00401012 int 3
00401013 int 3
00401014 int 3
00401015 int 3
00401016 int 3
00401017 int 3
00401018 int 3
00401019 int 3
0040101A int 3
0040101B int 3
0040101C int 3
0040101D int 3
0040101E int 3
0040101F int 3
--- e:\study\vc6\cpractice.c ---------------------------------------------------------------------
1: int fun (int i);
2:
3: int main ()
4: {
00401020 push ebp
00401021 mov ebp,esp
00401023 sub esp,44h
00401026 push ebx
00401027 push esi
00401028 push edi
00401029 lea edi,[ebp-44h]
0040102C mov ecx,11h
00401031 mov eax,0CCCCCCCCh
00401036 rep stos dword ptr [edi]
5: int i=1;
00401038 mov dword ptr [ebp-4],1
6: fun(i);
0040103F mov eax,dword ptr [ebp-4]
00401042 push eax
00401043 call @ILT+0(_fun) (00401005)
00401048 add esp,4
7: }
0040104B pop edi
0040104C pop esi
0040104D pop ebx
0040104E add esp,44h
00401051 cmp ebp,esp
00401053 call __chkesp (004010a0)
00401058 mov esp,ebp
0040105A pop ebp
0040105B ret
--- No source file -------------------------------------------------------------------------------
0040105C int 3
0040105D int 3
0040105E int 3
0040105F int 3
00401060 int 3
00401061 int 3
00401062 int 3
00401063 int 3
00401064 int 3
00401065 int 3
00401066 int 3
00401067 int 3
00401068 int 3
00401069 int 3
0040106A int 3
0040106B int 3
0040106C int 3
0040106D int 3
0040106E int 3
0040106F int 3
--- e:\study\vc6\cpractice.c ---------------------------------------------------------------------
8:
9: int fun (int i)
10: {
00401070 push ebp
00401071 mov ebp,esp
00401073 sub esp,40h
00401076 push ebx
00401077 push esi
00401078 push edi
00401079 lea edi,[ebp-40h]
0040107C mov ecx,10h
00401081 mov eax,0CCCCCCCCh
00401086 rep stos dword ptr [edi]
11: return i;
00401088 mov eax,dword ptr [ebp+8]
12: }
0040108B pop edi
0040108C pop esi
0040108D pop ebx
0040108E mov esp,ebp
00401090 pop ebp
00401091 ret


谁给分析分析?都是在编译的时候分配的空间吧?那是在编译到哪个位置的时候分配的的呢?
hai040 2008-07-23
  • 打赏
  • 举报
回复
1,没区别吧,随编译器喜欢
2,程序一加载就分配,(1)(3)只是给编译器看,编译后只存在代码段和入口地址
造句大全 2008-07-23
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 yyyapple 的回复:]
在变量和函数定义时候,定义了表明能找到它,也就加载如内存了
所以是1 (1), 2(3)
[/Quote]



对第二个,也就是函数的分配开始有了分歧了,。。。。
造句大全 2008-07-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wuyu637 的回复:]
void fun_1(void);//(1)
int main()
{
.....
fun_1();//(2)

}

void fun_1(void)//(3)
{
....
}

1只是声明了一个函数,内存里还没有函数大小等的概念,实际上只是一个符号表中的函数符号。
3,实现了函数,但是没有放入内存。

2, 应该这个时候才是把函数放入到内存了。
[/Quote]




函数,变量好像都要声明,不声明,就会报错。。
但为什么要声明,能指点一下它的原理吗?
谢谢
yyyapple 2008-07-23
  • 打赏
  • 举报
回复
在变量和函数定义时候,定义了表明能找到它,也就加载如内存了
所以是1 (1), 2(3)
造句大全 2008-07-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wuyu637 的回复:]
int a;//(1)
cout < < &a < < endl;
a = 12;//(2)
cout < < &a < < endl;


在1后面就能找到a的地址。说明,a在1后已经存在了。


[/Quote]


对,两次打印出来的地址一样
wuyu637 2008-07-23
  • 打赏
  • 举报
回复
void fun_1(void);//(1)
int main()
{
.....
fun_1();//(2)

}

void fun_1(void)//(3)
{
....
}

1只是声明了一个函数,内存里还没有函数大小等的概念,实际上只是一个符号表中的函数符号。
3,实现了函数,但是没有放入内存。

2, 应该这个时候才是把函数放入到内存了。
ChamPagneZ 2008-07-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 doulyun 的回复:]
引用 2 楼 yyyapple 的回复:
反汇编看看


不会!!
[/Quote]
回答的真漂亮!
变量的内存分配在定义处!
函数,则在调用时重新申请一个栈.
上山老人 2008-07-23
  • 打赏
  • 举报
回复
一个是1后吧 定义一个变量 就把内存给它了 应该和c#不一样
wuyu637 2008-07-23
  • 打赏
  • 举报
回复
int a;//(1)
cout << &a << endl;
a = 12;//(2)
cout << &a << endl;


在1后面就能找到a的地址。说明,a在1后已经存在了。

造句大全 2008-07-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 yyyapple 的回复:]
反汇编看看
[/Quote]

不会!!
yyyapple 2008-07-23
  • 打赏
  • 举报
回复
反汇编看看
dahua010 2008-07-23
  • 打赏
  • 举报
回复
个人认为应该是
1(1), 2(2)

69,369

社区成员

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

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