新人问关于堆的问题

love_zh 2012-02-24 02:05:41
一直不清楚不管是使用new还是malloc用来分配内存就是指的动态内存分配
但是这里的动态在哪里?分配的空间能动态增长吗?
还有就是对于堆和栈我只是理解到他们的区别是映射在虚拟地址空间的不同地址区域,一个手动回收,一个需自动回收。可分配的大小的差异。
希望有人能详细解答下2者的区别,否则使用起来都不知道为什么?
新手求解,先谢谢各位啦
...全文
237 43 打赏 收藏 转发到动态 举报
写回复
用AI写文章
43 条回复
切换为时间正序
请发表友善的回复…
发表回复
love_zh 2012-02-24
  • 打赏
  • 举报
回复
[Quote=引用 42 楼 muyi66 的回复:]

引用 41 楼 love_zh 的回复:

刚查了下ISO C99引入变长数组,可能这样灵活性更高
谢谢
[/Quote]
谢谢你才是,可以结帖了
muyi66 2012-02-24
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 love_zh 的回复:]

刚查了下ISO C99引入变长数组,可能这样灵活性更高
[/Quote]谢谢
love_zh 2012-02-24
  • 打赏
  • 举报
回复
[Quote=引用 40 楼 muyi66 的回复:]

引用 36 楼 love_zh 的回复:

是不是C99之后加入的我不确定,但是从这个来看,对于运行时分配内存太小的对于静态还是动态内存分配应该没差异了,关键的区别是如何按需求调整内存分配的大小实现不同情况的兼容才是动态内存的优点吧
这个是我目前的理解,不知道对不对
不推荐这样的分配方式,感觉既不标准又不安全。而且还没想到有什么必要这么做。

动态需求用malloc很简单也更符合传统……
[/Quote]
刚查了下ISO C99引入变长数组,可能这样灵活性更高
muyi66 2012-02-24
  • 打赏
  • 举报
回复
[Quote=引用 36 楼 love_zh 的回复:]

是不是C99之后加入的我不确定,但是从这个来看,对于运行时分配内存太小的对于静态还是动态内存分配应该没差异了,关键的区别是如何按需求调整内存分配的大小实现不同情况的兼容才是动态内存的优点吧
这个是我目前的理解,不知道对不对
[/Quote]不推荐这样的分配方式,感觉既不标准又不安全。而且还没想到有什么必要这么做。

动态需求用malloc很简单也更符合传统,感受上似乎要安全些吧。
love_zh 2012-02-24
  • 打赏
  • 举报
回复
[Quote=引用 38 楼 ever_lover 的回复:]

只需记住malloc和free
[/Quote]
你指的是什么?望指点
Ever_lover 2012-02-24
  • 打赏
  • 举报
回复
只需记住malloc和free
love_zh 2012-02-24
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 muyi66 的回复:]

用什么编译的?.c还是.ccp?

好像C++是能支持动态的数组定义。
[/Quote]
.C,用的是GCC,gcc -O1 -c
love_zh 2012-02-24
  • 打赏
  • 举报
回复
是不是C99之后加入的我不确定,但是从这个来看,对于运行时分配内存太小的对于静态还是动态内存分配应该没差异了,关键的区别是如何按需求调整内存分配的大小实现不同情况的兼容才是动态内存的优点吧
这个是我目前的理解,不知道对不对
赟阳 2012-02-24
  • 打赏
  • 举报
回复
学习了!
muyi66 2012-02-24
  • 打赏
  • 举报
回复
用什么编译的?.c还是.ccp?

好像C++是能支持动态的数组定义。
love_zh 2012-02-24
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 muyi66 的回复:]

那不奇怪啊,x里是个常数值就完全没问题。

不过不知道给个变数值还行不行。很多年没关注过新的语言标准变化了。
[/Quote]
X是我用scanf写入的一个值
muyi66 2012-02-24
  • 打赏
  • 举报
回复
那不奇怪啊,x里是个常数值就完全没问题。

不过不知道给个变数值还行不行。很多年没关注过新的语言标准变化了。
love_zh 2012-02-24
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 muyi66 的回复:]

malloc是函数啊,编译的时候它还没运行,当然是没分配了。

直接定义的变量才会在编译时指定如何分配内存空间。
[/Quote]
但是我写一个int A[x];怎么也是可以运行的?
muyi66 2012-02-24
  • 打赏
  • 举报
回复
malloc是函数啊,编译的时候它还没运行,当然是没分配了。

直接定义的变量才会在编译时指定如何分配内存空间。
love_zh 2012-02-24
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 muyi66 的回复:]

当然能通过编译。malloc是函数,给它参数它就分配内存,很乖的。
[/Quote]
程序是跑过了,
但是malloc是函数,在我编译时X的值并未给出啊,那是不是说明编译阶段没有进行内存分配呢?
muyi66 2012-02-24
  • 打赏
  • 举报
回复
当然能通过编译。malloc是函数,给它参数它就分配内存,很乖的。
love_zh 2012-02-24
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 muyi66 的回复:]

引用 25 楼 love_zh 的回复:

引用 24 楼 muyi66 的回复:

每一次的malloc是有被预先编译好的大小的。但究竟会malloc多少次却是不能预知的。所谓动态,就是指的这个。

你的解释我能理解,但是2楼说的好像是指的是空间大小能等到运行时再确定?而不是使用次数的问题,这点是我不能理解的。
那大概是个片面的理解。实际上很少有程序采用那样的方式分配内存。

……
[/Quote]
这样的程序没尝试过,我先写个程序试试看是不是能通过编译
muyi66 2012-02-24
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 love_zh 的回复:]

引用 24 楼 muyi66 的回复:

每一次的malloc是有被预先编译好的大小的。但究竟会malloc多少次却是不能预知的。所谓动态,就是指的这个。

你的解释我能理解,但是2楼说的好像是指的是空间大小能等到运行时再确定?而不是使用次数的问题,这点是我不能理解的。
[/Quote]那大概是个片面的理解。实际上很少有程序采用那样的方式分配内存。

从做法上来说,就如下面这样:

// 程序得到一个数字,赋给某变量。比如x

// 然后分配出那么大小的空间给某指针变量挂接。
p = (char*)malloc(x*sizeof(char));

这样的话,每次运行分配的空间大小就不一定了。
love_zh 2012-02-24
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 muyi66 的回复:]

每一次的malloc是有被预先编译好的大小的。但究竟会malloc多少次却是不能预知的。所谓动态,就是指的这个。
[/Quote]
你的解释我能理解,但是2楼说的好像是指的是空间大小能等到运行时再确定?而不是使用次数的问题,这点是我不能理解的。
muyi66 2012-02-24
  • 打赏
  • 举报
回复
每一次的malloc是有被预先编译好的大小的。但究竟会malloc多少次却是不能预知的。所谓动态,就是指的这个。
加载更多回复(23)

69,373

社区成员

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

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