LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1425|回复: 8

函数内部局部数组是在堆分配还是栈分配?

[复制链接]
发表于 2006-9-13 20:09:11 | 显示全部楼层 |阅读模式
函数内部数组呢?
比如:
void fun()
{

   int a[100];
   char *p="hello world"
   ......
}
这里的数组a在哪分配?还有p指向的字符串常量。
如果在栈分配的话,a数组太大不是会造成溢出?
发表于 2006-9-13 20:40:21 | 显示全部楼层
这是源程序
  1. 1 void fun1(){
  2. 2     int a[100];
  3. 3 }
  4. 4 void fun2(){
  5. 5 }
复制代码

这是编译之后的汇编代码
  1. 1     .file   "main.c"
  2. 2     .text
  3. 3 .globl fun1
  4. 4     .type   fun1, @function
  5. 5 fun1:
  6. 6     pushl   %ebp
  7. 7     movl    %esp, %ebp
  8. 8     subl    $400, %esp
  9. 9     leave
  10. 10     ret
  11. 11     .size   fun1, .-fun1
  12. 12 .globl fun2
  13. 13     .type   fun2, @function
  14. 14 fun2:
  15. 15     pushl   %ebp
  16. 16     movl    %esp, %ebp
  17. 17     popl    %ebp
  18. 18     ret
  19. 19     .size   fun2, .-fun2
  20. 20     .ident  "GCC: (GNU) 4.1.1 (Gentoo 4.1.1)"
  21. 21     .section    .note.GNU-stack,"",@progbits
复制代码

第八行 subl    $400, %esp 是func1比func2多出的一行,这一句就对应
int a[100];
32位机器上正数占用4个字节,所以要给他把堆栈指针在堆栈里开辟出400个字节的位置来,所以在堆栈中。
你也可以试试在全局变量中定义一个变量试试,他会和程序编译在一起。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-9-13 20:44:02 | 显示全部楼层
Post by vliqi
这是源程序
  1. 1 void fun1(){
  2. 2     int a[100];
  3. 3 }
  4. 4 void fun2(){
  5. 5 }
复制代码

这是编译之后的汇编代码
  1. 1     .file   "main.c"
  2. 2     .text
  3. 3 .globl fun1
  4. 4     .type   fun1, @function
  5. 5 fun1:
  6. 6     pushl   %ebp
  7. 7     movl    %esp, %ebp
  8. 8     subl    $400, %esp
  9. 9     leave
  10. 10     ret
  11. 11     .size   fun1, .-fun1
  12. 12 .globl fun2
  13. 13     .type   fun2, @function
  14. 14 fun2:
  15. 15     pushl   %ebp
  16. 16     movl    %esp, %ebp
  17. 17     popl    %ebp
  18. 18     ret
  19. 19     .size   fun2, .-fun2
  20. 20     .ident  "GCC: (GNU) 4.1.1 (Gentoo 4.1.1)"
  21. 21     .section    .note.GNU-stack,"",@progbits
复制代码

第八行 subl    $400, %esp 是func1比func2多出的一行,这一句就对应
int a[100];
32位机器上正数占用4个字节,所以要给他把堆栈指针在堆栈里开辟出400个字节的位置来,所以在堆栈中。
你也可以试试在全局变量中定义一个变量试试,他会和程序编译在一起。

恩。非常感谢。
回复 支持 反对

使用道具 举报

发表于 2006-9-13 21:13:31 | 显示全部楼层
想问一下,你这里是怎么查看汇编的代码的?
用的啥工具啊?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-9-13 21:46:47 | 显示全部楼层
gcc可以直接生成汇编代码吧
回复 支持 反对

使用道具 举报

发表于 2006-9-13 22:22:39 | 显示全部楼层
Post by dengwangxi
想问一下,你这里是怎么查看汇编的代码的?
用的啥工具啊?

[PHP]gcc -S main.c
[/PHP]
回复 支持 反对

使用道具 举报

发表于 2006-9-14 10:07:02 | 显示全部楼层
局部变量在栈分配, 只有malloc,new等分配的内存在堆中.
所有的内存分配都有可能出错,不过pc机上由于操作系统的内存管理强劲比较少碰到罢了, 而且由于虚拟内存的原因, 你在代码中死循环new都是不会出错的.内存消耗光了就占用你硬盘,除非硬盘满.
回复 支持 反对

使用道具 举报

发表于 2006-9-14 15:58:54 | 显示全部楼层
最近整汇编的人很多阿,“你要是只会C语言,你都不好意思跟人打招呼”。
回复 支持 反对

使用道具 举报

发表于 2006-9-14 16:20:59 | 显示全部楼层
Post by delixizhou
局部变量在栈分配, 只有malloc,new等分配的内存在堆中.
所有的内存分配都有可能出错,不过pc机上由于操作系统的内存管理强劲比较少碰到罢了, 而且由于虚拟内存的原因, 你在代码中死循环new都是不会出错的.内存消耗光了就占用你硬盘,除非硬盘满.

操作系统能管理的了吗?比如32位机,之能管理4G的线性空间,超过4G,地址是如何命名的呢?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表