虽然回家了,但还是很忙。工程师的复审已经通过了,但还需要准备一些材料。呵呵,真怀念学生时代啊。
抓紧时间说说这个变长数组的事吧。变长数组作为一种C语言的特性是在C99标准中加入的。
至于楼上几位觉得困惑的朋友,你们需要先区分两个概念,C语言标准和C语言编译器。
变长数组的原理并不复杂,编译器根据其长度变量在它的周期中于栈中申请一块内存给它使用。
与malloc相比的主要不同之处就是malloc申请的内存在堆中。
这一不同之处使得变长数组具有很多优点:
1.相较于普通定长数组可以节省空间。
实际应用中很多时候我们不能在编译前确定一个数组所需要空间是多少。
为此我们在没有变长数组前只能开辟一个足够大的空间(动态申请的方法一会儿再说)。
这会造成内存的浪费,当然浪费程度要具体问题具体分析。
有了变长数组后,我们就可以按需申请刚刚好的空间使用。
2.相较于malloc,效率更高更方便更安全。
在栈中申请内存只需要移动栈顶指针即可(入栈操作),效率是变长数组最大的优势。
而从堆中申请内存是一件很复杂的事情。一般堆由系统以类似链表的方式管理。一块堆空间的申请与销毁涉及很多操作,这使得从堆中申请空间的开销很大。而且还存在一个风险,那就是内存泄漏。
而变长数组在它的生命周期结束后直接出栈即可释放内存,而且这一过程的代码由编译器自动生成,不需要程序员显式参与,减少了内存泄漏的风险。
说完变长数组的优点,再说说它的缺点。
它的缺点与它的优点是伴生的,正所谓鱼和熊掌不可兼得。
正因为它的空间是在栈里,所以它的尺寸受到了限制。一般一个进(线)程的栈空间是由系统分配的,其大小1到8M不等。当需要使用大量内存时它显然无能为力。这时malloc的能力就突显出来了。当然,在感受它的能力时别忘了最后要free它。
总结。每一种技术都不是完美的,换句话说就是做任何事都是需要代价的。
程序员的工作就是针对具体的问题选择最适合的技术应用之。
要做到这一点你需要尽量多的掌握各种技术的优缺点,从而扬长避短。
最后再提醒一句,变长数组的长度不一定得是变量,表达式也是可以的。变长数组也可以是多维的。