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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言里,啥时候用数组啥时候用指针和动态内存(malloc/calloc)?相关的知识,希望对你有一定的参考价值。

比如
int arr[100];

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

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

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

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

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

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

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

追答

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

参考技术D 肯定不是噻,使用动态内存在C语言中要自己手动去释放,如果使用不得当很容易就会造成内存泄露啊之类的。而在栈上分配数组则是由程序自动释放内存,比较安全。

c语言中const 是啥意思,怎么用,啥时候用?

希望能深入浅出,不要长篇大论。谢谢 。

const 表示常量,相当于宏定义,只能读取,不能修改。

常变量:const 数据类型 符号常变量 = 数值
如:const float PI=3.14;

指针常量:
数据类型 *const 指针变量=变量名
如:char *const p="abc";
const修饰的是指针变量,而不是指针的值,所以指针指向的值是可以修改的。

常指针:
const 数据类型 *指针变量=变量名
或者是
数据类型 const *指针变量=变量名
这是指针指向的值就是不可以改变的。

还有一种情况就是指针变量本身不可以修改,指针指向的值也是不允许修改的,就是指针常量和常指针组合,这种称为
常指针常量:
const 数据类型 *const 指针变量=变量名

数据类型 const *const 指针变量=变量名

还有一个比较重要的就是常函数:这个我自己还是前一段时间刚刚理解,建议你看看这个网页:http://blog.csdn.net/JimFire/archive/2008/10/06/3020013.aspx。
参考技术A const是定义常量的意思在编程中 常量是 只能初始的时候赋值 其后不能再改变被声明为常量的值比如const int a=1;//定义整型常量a并赋初值为1那么不能再改变a的值 如执行a=2; 就会运行错误在整个程序中 a的值始终为1 不能改变 这就是常量 参考技术B const的意思是:定义常量;用法:例如:const int a=1;以后我们的a就是常量了就不能改变其值。什么时候用:譬如:当我们用3.1415926的时候,每次都输入,比较麻烦,而且容易输错,在这种时候我们就要用const了。 参考技术C

常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。

const 推出的初始目的,正是为了取代预编译指令,消除它的缺点,同时继承它的优点。

作用:

(1)可以定义const常量,具有不可变性。

例如:const int Max=100; Max++会产生错误; 

(2)便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患。  

 例如: void f(const int i) ......... 编译器就会知道i是一个常量,不允许修改;  

(3)可以避免意义模糊的数字出现,同样可以很方便地进行参数的调整和修改。 同宏定义一样,可以做到不变则已,一变都变!   

如(1)中,如果想修改Max的内容,只需要:const int Max=you want;即可!   

(4)可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。 还是上面的例子,如果在函数体内修改了i,编译器就会报错;   

例如: void f(const int i) i=10;//error!  

参考技术D const的作用是固化修饰,被修饰的对象本身的属性并没有发生变化,只不过是被固化不能修改,若修改,系统则会报错提醒被固化的值正在被修改!

以上是关于C语言里,啥时候用数组啥时候用指针和动态内存(malloc/calloc)?的主要内容,如果未能解决你的问题,请参考以下文章

c语言里有memset()怎么用?需要啥头文件?

c语言中啥是动态分配内存?

c语言中取地址符和*有啥区别?

求C语言memset的具体用法,啥时候必须用,啥时候可以不用以及可以用啥替换memset

c语言指针怎么理解,啥时候会用到指针,要注意哪些方面

Qt中新建类的时候,有的时候用&,有的时候用*,有的时候啥都没有。