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语言中要自己手动去释放,如果使用不得当很容易就会造成内存泄露啊之类的。而在栈上分配数组则是由程序自动释放内存,比较安全。

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

C语言中动态内存分配函数的用法及作用?(比如malloc,calloc,realloc等...
调用calloc函数时,calloc(n,sizeof(int))表示请求n个连续的、每个长度为整型的空间,若成功返回这些空间的首地址。(int *)表示将这个地址放在指针中。到此为止,就可以用指针来对分配到的空间操作了。注意,最后一定要用free函数释放申请到的空间,否则这部分空间会一直占着。malloc、calloc、realloc的...

C语言中的动态内存分配的用法举例
1、malloc函数:其作用是在内存的动态存储区中分配一个长度为size的连续空间。其参数是一个无符号整形数,返回值是一个指向所分配的连续存储域的起始地址的指针。2、free函数:由于内存区域总是有限的,不能不限制地分配下去,而且一个程序要尽量节省资源,所以当所分配的内存区域不用时,就要释放它,以...

【C】动态内存管理 malloc calloc relloc free 函数详解
C语言还提供了一个函数叫 calloc,calloc函数也用来动态内存分配。原型如下:示例:调试结果如图,可以理解为calloc = malloc+(memset将开辟的空间初始化为0)。如果我们对申请的内存空间的内容要求初始化,那么可以很方便的使用calloc函数来完成任务。2.3 realloc 函数原型如下:情况1 当是情况1 的时候...

malloc()和calloc
malloc()可能需要花费时间合并小块内存以满足需求。在使用malloc()时,必须注意返回值的检查,因为分配失败时它会返回NULL指针。因此,明智的做法是在动态内存分配后检查返回值。总的来说,malloc()和calloc()在内存分配和初始化方面有所差异,开发者应根据具体需求选择合适的方法。

C语言内存管理机制--malloc\/calloc\/free原理与实现
在C程序中,存储空间布局通常分为栈和堆两种类型。栈用于函数调用时的局部变量存储,其大小由编译器自动管理,遵循后进先出(LIFO)原则。堆用于动态内存分配,可以由程序在运行时动态地请求和释放内存。二、Heap内存模型 在堆内存中,malloc所申请的内存主要从堆区域分配。Linux内核通过维护一个break指针来...

c语言中 malloc和calloc怎么用?有什么区别?使用时该注意些什么?
)malloc(sizeof(int)*16);\/\/这里每次在使用malloc的时候前面要加一个强制类型转换,转换到你需要的类型,后面的括号内就是申请的大小,我这例子是申请的16个整数型大小内存代表这个M可以当数组用了m[11]=8899;printf("%d",m[11]);free(m);\/\/记得每次申请后都需要释放内存,不然会造成浪费影响...

calloc和malloc的区别
程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存.动态内存的生存期由用户决定,使用非常灵活,但问题也最多.(2)C语言跟内存申请相关的函数主要有 alloca、calloc、malloc、free、realloc等.<1>alloca是向栈申请内存,因此无需释放.<2>malloc分配的内存是位于...

malloc()和calloc()有啥区别
malloc()和calloc()的功能都是在内存的动态存储区中分配n个长度为size的连续空间,函数返回一个指向分配起始地址的指针。而他们之间的区别就是calloc在动态分配完内存后,自动初始化该内存空间为零,而malloc不初始化,里边数据是随机的垃圾数据。比如说在内存中分配长度为10的int类型的数组,若使用的是...

malloc()和calloc()有啥区别
1. malloc:malloc函数在内存中动态分配指定大小的内存空间。它接受一个参数,即要分配的字节数,并返回一个指向新分配内存的指针。malloc不会初始化分配的内存,分配的内存中的值是随机的,或者可能包含旧的、无效的数据。2. calloc:calloc函数也用于在内存中分配指定大小的内存空间,但与malloc不同的是...

相似回答