C中申请动态内存详解原理和使用方法

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/ZhangaZhaoLong/article/details/101555290

c中动态内存的申请:

  1. C中动态内存申请最常用的一种方法就是malloc了,但其实申请动态内存就是可以申请的空间大一点而已,因为栈空间是很小的,我们一般在函数中写的东西都是在栈上申请的,所以有时候我们明明还有很多内存但我们就申请不到,这时我们就可以去申请堆上的内存,堆上的内存是很大的,但相比较栈上的内存,各自有自己的优点,栈上内存虽然小,但当一个函数结束,就会自动销毁栈桢,所以存在栈上的东西我们一般都不会管,而堆上的内存虽然大,但它不会自动销毁,需要我们手动释放,有时我们在进行一些麻烦的操作时很容易忘记释放,虽然说我们的动态数组是通过malloc实现的,但其实除了初始申请内存时,可以比栈大一些,也没什么了,所谓的动态,说它可以自动扩展改变数组的长度是骗人的

  2. 因为要扩容,我们一般使用的是realloc,而realloc也是通过malloc实现的,不过就是在其中,做了一些变化,就比如说,我们要给数组扩容,它在内部其实是做了一个判断,因为我们在初始时,这个数组有一段连续的内存,然后它发现你要扩容,先看看后面还有没有足够的空间,如果没有就直接在堆上申请一块符合你要求的连续内存,然后把原来数组中的数据拷贝过来,再把原来的数组空间进行一个销毁,然后它的空间地址就变化了,不是原来的地址了

  3. 在这里插入图片描述
    当执行完这个函数第一句时a的地址为:
    在这里插入图片描述
    当执行完第二句时:在这里插入图片描述
    a的地址已经改变

  4. malloc的使用时,因为返回的是一个那个空间的地址,所以你必需用一个指针来接收,但是因为堆上有各种类型的空间,所以malloc是一个void*的函数(因为它要可以申请各种类型的空间),也就是说你在使用时,必需做一个强制类型转换,变成你需要的空间地址类型,然后malloc有一个参数,就是你要申请的字节数,申请完成后,它的内存是一个随机数,你要进行初始化

ps:int* a = (int*)malloc(4*sizeof(int));
  1. 还有一个叫做cllaoc,它的作用和malloc差不多都是在堆上申请空间,但它有两个参数,先说第二个参数,它的作用是你要申请多大的内存,但这个内存不是你要申请的全部大小而是你要申请的一块的大小,第一个参数就是你要参数这种字节大小内存的块数,同样它也是void*的函数,但是它会把你申请的这几块内存全部初始化为0,其实也还挺没用的
ps:int* a = (int*)calloc(4, sizeof(int));
  1. 最后就是realloc,它是用来扩容的,在你用malloc或calloc申请的内存不足时,你可以用它来扩容,具体用法是,它也是一个void*(泛型)的函数,有两个参数第一个参数是你要进行扩容的首地址,第二个参数是你要扩容到多大的字节,比原来大刚才已经说过了,比较原来小的话,会将多余的空间直接释放,不会给你保留
 ps:a = (int*)realloc(a, 4*sizeof(int))

猜你喜欢

转载自blog.csdn.net/ZhangaZhaoLong/article/details/101555290