C语言里,什么时候用数组什么时候用指针和动态内存(malloc/calloc)?

比如
int arr[100];

int* pArr;
pArr = (int*)malloc(100*sizeof(int));
free(pArr);
似乎都能解决问题。但我做了一个简单测试,好像动态内存要快20%左右,而且数组的大小好像有个上限,是不是在实际操作中就可以通用动态内存而舍弃数组了呢?

如果明确知道所需内存的大小,可以用数组.
数组大小确实有限制.因为局部数组是分配在栈上的,而栈大小是有限制的,如果超过限制,就会出现栈溢出.

如果不能明确知道所需内存的大小,编程中这种情况非常常见.这个时候只能用动态内存.
但是用动态内存容易出bug,主要是忘记忘记释放内存(内存溢出)和野指针(指针指向的地址不是malloc分配的内存地址). 另外,频繁动态分配内存容易导致内存碎片. 这些问题在嵌入式系统中都是致命的.所以要格外小心.

建议明确知道大小的情况下,并且size不大的情况下,使用数组.
其他情况下使用动态内存.并且记得在使用完毕后释放内存并且让指针赋零值.避免出现bug.

以后编程经验多了,你就知道该怎么处理了.数组和动态内存都会用到的,因地制宜.
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-11-06
这是三种不同的概念:
数组:一种数据结构
指针:储存的值是内存地址的变量,语言工具
动态内存:在堆(heap)中分配的内存,大小随你定,程序运行起来后,并运行了分配语句才时会分配这个内存(动态的,又称运行时的),分配好了后返回一个指针给你,用这个指针操作这块堆内存。

比如:”int arr[100]“,的内存是分配在堆栈(stack) 或者 数据段(初始化段或者未初始化)中,并且必须明确大小,不能像这样:”int arr[nSize]",用一个变量代替他的大小,但malloc中可以,你可以用一个变量表示malloc大小参数,方便于启动程序是传一个你愿意的大小赋值给这个变量。
对于初学者理解很简单:这两种方法分配内存都可以,但是大的内存分配最好在堆(heap)中,因为stack相当来说空间更有限。然后堆(heap)都是通过指针操作,malloc后一定要记得free,打个比方:内存(memory)就像Money,你只管花(malloc、calloc),不管赚(free),迟早是要完蛋的!
第2个回答  2012-11-04
堆上分配内存通常比栈慢。
而且堆内存要记得释放不然会造成内存泄漏。
堆内存没有什么限制,现在用的都是虚拟内存。
数组长度确定且主要用于查询时最好在栈上分配。本回答被提问者和网友采纳
第3个回答  2012-11-04
单纯说内存分配,不说参数化传递。
1.程序使用的范围;
单片机,工业控制,对于已知信息尽量采用数组。短而有效,空间大了就不好了。
2.资源有效使用,不定长度的分离;
不定长度,动态分配。追问

谢谢,但是为什么我在电脑上对数组和动态分配的内存进行一些简单的求和等等操作却发现动态内存操作快一些呢?
比如操作 arr[i] 和 *(pArr+i) 好像要快一些

追答

对已分配好的空间进行操作,在运算效率上相差不大,除超出页的情况。

第4个回答  2012-11-04
肯定不是噻,使用动态内存在C语言中要自己手动去释放,如果使用不得当很容易就会造成内存泄露啊之类的。而在栈上分配数组则是由程序自动释放内存,比较安全。
相似回答