C语言动态分配内存的函数

今天在学习中碰见了动态分配内存有关的函数:malloc realloc calloc free。以下是详细的记录

"动态内存":在程序运行期间,动态分配内存空间,一般是在"堆,heap"空间上分配。

malloc: memory allocate 内存分配
realloc: repeat allocate 再分配——重新分配:一次内存分配完成之后,后面用的时候,发现不够用,再分配。
calloc: clear allocate 分配内存时同时清 0
free :释放
动态分配的内存,需要在你不用的时候,需要手动释放free,否则这个空间一直时你的。
动态内存分配:如果分配了空间,就一直存在,直到你手动free或者进程结束。

有时候,把动态分配的内存“匿名内存”,“匿名内存”只能通过他的指针去访问。

一、malloc 内存分配

#include<stdlib.h>//malloc的头文件
  malloc向系统申请一段连续的大小为size字节的空间,并且把内存的首地址返回(void*)
   
    void* malloc(size_t size);
  
  size: 你要分配多大的空间,单位是字节,要分配多大,就输入。
  返回值:
        内存开辟成功,返回开辟空间的首地址(void*)通用指针类型
        不成功,返回NULL
//用malloc写一个动态数组
#include<stdio.h>
#include<stdlib.h>
int main()
{
    int n;
    printf("请输入你要的数组大小:\n");
    scanf("%d",&n);
    int *p = (int*)malloc(n*sizeof(int));
    for(int i=0;i<n;i++)
    {
        scanf("%d",p+i);
    }
    for(int j=0;j<n;j++)
    {
        printf("%d ",p[j]);
    }
}

二、relloc内存再分配

#include <stdlib.h>
   
realloc 用来把ptr(malloc/calloc/realloc返回的地址,或者是NULL)
             指向的空间,扩大到size大小
    
void *realloc(void *ptr, size_t size);
			
           1.
             ptr == NULL,首次分配
             	realloc(NULL,size)  <==> malloc(size)
             ptr != NULL
             	<1> size > 原来的大小
             		"扩建"
             	realloc用来把ptr指向的内存,扩大到size大小
             		原来的内存内容保持不变,后面新增的内存不会初始化.
             		他只负责分配空间.
             			(1)原址扩建
             			(2)整体搬迁
          2.
             size == 0
             	realloc(ptr,0) <==> free(ptr)
          	size < 原来的大小
             	这种情况,作者没有考虑到这种行为,这种行为是未定义的(什么结果都有可能发生)
//以下是用realloc将内存扩建
#include<stdio.h>
#include<stdlib.h>
int main()
{
    int* p=(int*)malloc(10*sizeof(int));用malloc函数开辟了一段4*10的字节大小空间,首地址保存在p中。
    p=(int*)realloc(p,80);//用realloc函数将原本的malloc开辟的空间扩容到了4*20字节大小空间,首地址还保存在p中。
    return 0;
}

三、calloc分配内存后 同时清零

#include <stdlib.h>

   calloc 也是用来从"堆空间" 分配内存的,只不过calloc分配的内存会自动清0

void *calloc(size_t n, size_t size);

		n : 要分配多少个元素
             size : 每个元素占多少个字节
             calloc 分配的总字节大小为 : n*size

         返回值 :
		成功 返回分配到的空间的首地址
                失败 返回NULL
//用calloc开辟一段空间且置零
#include<stdio.h>
#include<stdlib.h>
int main()
{
    int* p=(int*)calloc(10,sizeof(int));//分配了10个元素,每个元素占用了4个字节,且全部置零。
    //打印验证
    for(int i=0;i<10;i++)
    {
        printf("%d ",*(p+i));
    }
    return 0;
}

四、free 释放分配的空间的

#include <stdlib.h>

   		free用来释放动态分配的空间的.
   void free(void *ptr);
		ptr : 要释放的空间的首地址,这个地址要是 malloc/calloc/realloc的返回值,其他地址
         返回值 :
				无
posted @   风恬月淡时  阅读(130)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示