| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5874 人关注过本帖, 4 人收藏
标题:有个疑惑待解
只看楼主 加入收藏
流泪的宇
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2012-11-9
收藏
得分:0 
回复 4楼 xiaojimmyche
看了半天,还是有些不懂
2012-11-09 12:16
moluo
Rank: 1
等 级:新手上路
帖 子:4
专家分:6
注 册:2010-12-30
收藏
得分:0 
为什么我用你的代码在GCC++编译就出现错误呢???
2012-11-09 14:02
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
虽然回家了,但还是很忙。工程师的复审已经通过了,但还需要准备一些材料。呵呵,真怀念学生时代啊。

抓紧时间说说这个变长数组的事吧。变长数组作为一种C语言的特性是在C99标准中加入的。

至于楼上几位觉得困惑的朋友,你们需要先区分两个概念,C语言标准和C语言编译器。

变长数组的原理并不复杂,编译器根据其长度变量在它的周期中于栈中申请一块内存给它使用。

与malloc相比的主要不同之处就是malloc申请的内存在堆中。

这一不同之处使得变长数组具有很多优点:

1.相较于普通定长数组可以节省空间。

实际应用中很多时候我们不能在编译前确定一个数组所需要空间是多少。

为此我们在没有变长数组前只能开辟一个足够大的空间(动态申请的方法一会儿再说)。

这会造成内存的浪费,当然浪费程度要具体问题具体分析。

有了变长数组后,我们就可以按需申请刚刚好的空间使用。

2.相较于malloc,效率更高更方便更安全。

在栈中申请内存只需要移动栈顶指针即可(入栈操作),效率是变长数组最大的优势。

而从堆中申请内存是一件很复杂的事情。一般堆由系统以类似链表的方式管理。一块堆空间的申请与销毁涉及很多操作,这使得从堆中申请空间的开销很大。而且还存在一个风险,那就是内存泄漏。

而变长数组在它的生命周期结束后直接出栈即可释放内存,而且这一过程的代码由编译器自动生成,不需要程序员显式参与,减少了内存泄漏的风险。


说完变长数组的优点,再说说它的缺点。

它的缺点与它的优点是伴生的,正所谓鱼和熊掌不可兼得。

正因为它的空间是在栈里,所以它的尺寸受到了限制。一般一个进(线)程的栈空间是由系统分配的,其大小1到8M不等。当需要使用大量内存时它显然无能为力。这时malloc的能力就突显出来了。当然,在感受它的能力时别忘了最后要free它。


总结。每一种技术都不是完美的,换句话说就是做任何事都是需要代价的。

程序员的工作就是针对具体的问题选择最适合的技术应用之。

要做到这一点你需要尽量多的掌握各种技术的优缺点,从而扬长避短。

最后再提醒一句,变长数组的长度不一定得是变量,表达式也是可以的。变长数组也可以是多维的。

重剑无锋,大巧不工
2012-11-09 14:19
sqh8891380
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2012-11-9
收藏
得分:0 
这个程序怎么有老谭的风格。
2012-11-09 16:24
GL_OPEN
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2012-11-9
收藏
得分:0 
纯无语,都用Win的角度来思考Linux
2012-11-09 23:59
GL_OPEN
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2012-11-9
收藏
得分:0 
本来网上查资料,可谁知看见一无知在这儿胡拐,还什么gCC垃圾…微软不用是有道理的,越来越看不下去了,GNU垃圾的话你有本事别让win上的软件后台去调用GNU系列的程序啊。再拿这个代码可编译来说,不懂别胡拐,还一句gcc差,就算免费你也不用……唉,越想越觉的不爽
2012-11-10 00:21
llwwzz
Rank: 2
等 级:论坛游民
帖 子:25
专家分:27
注 册:2012-11-12
收藏
得分:0 
回复 20楼 TonyDeng
本人已经混过去了一年的大学课程,当初对这个还是有兴趣的,到大二是真的想学好这个东西,通过练习,阅读对c语言有一些感觉,写一些小程序(书上的)也能成功,就是因为学校教的开始用的环境是tc3.0后来用到vc6.0    本人英语不太好,读错误还是有些吃力,看到版主的图片就想问问这个是什么软件,那里下载的?qq。582094857.。。。。。。。。。。。。。。。。
2012-11-12 22:20
liufashuai
Rank: 9Rank: 9Rank: 9
来 自:冥界-魔域-魂殿
等 级:蜘蛛侠
威 望:1
帖 子:370
专家分:1374
注 册:2012-6-22
收藏
得分:0 
肯定运行不了,搞不好是你的编译器版本过低,或者你运行错文件了

数组长度必须在编译时候确定,但是你输入的n是在运行期才确定的大小,逻辑上有问题,编译器不可能犯这么明显的错误

有一种落差是,你配不上自己的野心,也辜负了所受的苦难。






2012-11-16 13:05
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
  不是求不变  而是应万变

我们多多学习
2012-11-18 12:40
a937585369
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2012-11-18
收藏
得分:0 
新手
2012-11-18 23:46
快速回复:有个疑惑待解
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.051544 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved