首页 > 系统相关 >C语言之动态内存申请

C语言之动态内存申请

时间:2024-11-14 12:15:55浏览次数:3  
标签:NULL int void 申请 C语言 内存 动态内存 include size

动态内存的作用

在开发中根据实际需求开辟内存

内存申请分类

静态内存申请(静态分配)

1,在程序编译或运行过程中,按事先规定大小分配内存空间的分配方式,如int a[10];

2,必须事先知道所需空间的大小

3,分配在栈区或全局变量区,一般以数组形式

4,按计划分配

特点:在程序运行中无法对其分配的内存进行修改

动态内存申请(动态分配)

1,在程序运行过程中,根据需要的大小自由分配所需空间

2,按需分配

3,分配在堆区,一般使用特定的函数进行分配

特点:在程序运行中可以使用函数对其内存进行动态分配

动态分配函数

注意:

以下函数由系统提供,属于库函数

意味着无需自己定义该函数,直接调用即可

因为动态内存分配的内存在堆区,无法自动释放内存,需要手动释放内存

memset

作用:将指定开始位置到指定长度的内存中的内容设置为指定值

语法:

        void *memset(void *s,int c,size_t n);

参数:

        void *s:开始位置

        int c:指定的内容

        n:设定的长度

返回值:

        设置的内存的首地址

所属头文件:

        #include <string.h>

如:

#include <stdio.h>
#include <string.h>

int main() {
    char str[10];
    // 使用memset将字符数组str中的每个元素都设置为字符 'A'
    memset(str, 'A', sizeof(str));
    // 输出字符数组,此时应该看到10个 'A' 组成的字符串(注意,不是标准字符串,因为没手动添加'\0')
    printf("%s\n", str);
    return 0;
}

free

作用:释放动态分配申请的内存

语法:

        void free(void *ptr);

参数:

        void *ptr:要释放的内存的首地址

返回值:

        void:没有返回值

所属头文件:

        #include <stdlib.h>

malloc

作用:堆区动态申请内存

语法:

        void *malloc(size_t size);

参数:

        size_t size:申请的内存大小,单位字节

返回值:

        void*:申请的内存的首地址,如果NULL说明申请失败

所属头文件:

        #include<stdlib.h>

如:

#include<stdio.h>

#include<stdlib.h>

int main()

{

        int len=0;

        printf("请输入存储个数\n");

        scanf("%d",&len);

        //申请空间

        void *nums=malloc(len * sizeof(int));

        if(nums==NULL)

        {

                printf("申请失败\n");

                return 0;

        }

        int *p=(int *) nums;

        for(int i=0;i<len;i++)

        {

                printf("%d\n",p[i]);

        }

        //释放空间

        free(p);

        return 0;

}    

//由于之前并没有对申请到的内存空间进行初始化赋值操作,所以打印出来的将是内存中对应位置上的随机值

calloc

作用:堆区动态申请内存

语法:

        void *calloc(size_t nmemb,size_t size);

参数:

        nmemb:申请的内存块数

        size:每块所占的字节数

返回值:

        void*:申请的内存的首地址,如果为NULL说明申请失败

所属头文件:

        #include<stdlib.h>

如:

#include<stdio.h>

#include<stdlib.h>

int main()

{

        int len=0;

        printf("请输入存储的个数\n");

        scanf("%d",&len);

        int *nums=(int*)(calloc(len,sizeof(int)));

        if(nums==NULL)

        {

                printf("申请失败\n");

                return 0;

        }

        for(int i=0;i<len;i++)

        {

                printf("%d\n",nums[i]);

        }

        //释放空间

        free(nums);

        return 0;

}

malloc与calloc的区别

malloc与calloc函数都是用来申请内存的

区别:

        1,函数名不同

        2,参数个数不同

        3,malloc函数申请的内存,内存中存放的内容是随机值,calloc函数申请的内存中的内容为0

realloc

作用:用于对先前通过malloccallocrealloc分配的内存块进行大小调整,可按需扩展、缩小或重新分配内存

语法:

        void *realloc(void *ptr,size_t size);

参数:

        void *ptr:要追加的内存的首地址

        size:重新申请的大小,单位字节

返回值:

        void *:追加的内存的首地址,如果为NULL说明追加失败

头文件:

        #include<stdlib.h>

内存泄漏

概念:内存泄漏是指申请的空间,没有被指向,系统无法回收该空间。或程序运行中动态分配的内存使用完未释放,使内存持续被占,可能耗尽系统可用内存。

产生原因

1,指向堆区的指针变量,指向了别的地方

        int *nums=calloc(10,4);

        int a=10;

        nums=&a;

2,指向堆区的指针变量 被意外释放

        void fun()

        {

                int *p=calloc(10,4);

        }

        int main()
        {

                fun();

                return 0;

        }

总之:

        使用完记得释放内存

 注意:

        重复释放同一片内存会导致程序出现问题

如何避免重复内存释放

在使用申请的内存后要释放并将原指针指向 NULL 每次释放前判断该指针是否为 NULL, 如果不为空在释放并制NULL
如: #include <stdio.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
                char *p = malloc(100);
                if(p != NULL){
                free(p);
                p = NULL;
        }
        if(p != NULL)
        {
                free(p);
                p = NULL;
        }
                return 0;
}

标签:NULL,int,void,申请,C语言,内存,动态内存,include,size
From: https://blog.csdn.net/m0_75253775/article/details/143759932

相关文章

  • C语言编程 1.11 寻找素数对
     #include<stdio.h>#include<math.h>intsushu(longlongn)        {            longlongsqrt_n=sqrt(n);            for(longlongi=2;i<=sqrt_n;i++)                {                 ......
  • 关于我重生到21世纪学C语言这件事——操作符详解
    与诸君共进步!!!还有你,也要加油!文章目录1.操作符的分类2.⼆进制和进制转换3.原码、反码、补码4.移位操作符5.位操作符:&、|、^、~6.单⽬操作符7.逗号表达式8.下标访问[]、函数调⽤()9.结构成员访问操作符10.操作符的属性:优先级、结合性11.表达式求值1.操作......
  • 二分查找(折半查找)函数与非函数写法代码介绍及其优缺点 C语言
    什么是二分查找?二分查找也叫折半查找 在有序的数组中查找目标的方法需要借助中间元素与目标值的比较来逐步缩小范围一直到找到目标元素或者不存在为止查找的步骤↓1确定左右端点的下标值(注:数组下标从0开始)2计算中间下标位置3比较中间下标位置的数组值与目标值的大......
  • 教你如何清楚的分辨c语言各类指针类型定义
       可以这样说,学好了指针,就代表你学好了c语言。c语言中,通过合理的利用指针,可以快速高效的实现各种底层逻辑。下面陈列c语言中的各类指针定义,让大家分辨其中的具体意义。1,指针变量  我们定义一个指针变量p,指向整形变量i。#include<stdio.h>intmain(){int......
  • C语言的结构体
    结构体的基本概念和使用结构体(Struct)是一种用户自定义的数据类型,它允许将不同类型的数据项组合成一个单一的复合数据类型。结构体中的每个成员可以是不同的数据类型,包括基本数据类型、数组、指针,甚至是其他结构体。结构体的使用非常广泛,尤其在需要组织和管理复杂数据时尤为有......
  • c语言第九课,各种算法
    选择排序选择排序(从未排序列找到最值,放到排序序列的起始位置)#include<stdio.h>voidselect_sort(inta[],intn)//定义选择排序函数{  for(inti=0;i<n-1;i++)//遍历数组找到最小的元素索引,n-1是因为最后一次可以排序两个  {    intmin=i;//假......
  • C语言——字符串函数
    1.字符分类函数 2.字符转换函数3.strlen的使⽤和模拟实现4.strcpy的使⽤和模拟实现5.strcat的使⽤和模拟实现6.strcmp的使⽤和模拟实现7.strstr的使⽤和模拟实现8.strtok函数的使⽤接下来让我们一一介绍每个函数的使用方法和如何模拟实现吧!!!1 .C语⾔中有......
  • C语言指针详解:用法与实例
    目录C语言指针详解:用法与实例引言1.指针基础1.1什么是指针?1.2如何声明指针?1.3获取变量的地址1.4解引用指针2.指针的高级用法2.1指针和数组2.2指针和函数参数2.3指针和动态内存分配3.指针的注意事项3.1空指针3.2悬空指针3.3指针运算C语言指针详......
  • 大语言模型(LLM)攻击技术研究项目申请
    1.课题拟解决的关键技术问题,拟采取的技术路线和主要创新点本课题的主要研究内容是LLM计算基础设施攻击技术研究、LLM模型自身安全研究和利用新prompt范式诱导LLM输出不良内容的攻击技术研究。这涉及到对驱动、AI平台、数据库、API接口等关键组件的深入剖析,探索LLM模型的安全边......
  • 可能是全网最详细的C语言函数全解析
    前言C语言中的函数是构建程序的基石,它就像一个个小工具,每个函数都有特定的功能,把这些小工具合理地组合起来就能构建出复杂而强大的程序。理解函数对于掌握C语言至关重要,这篇博客将详细介绍C语言函数的各个方面。一.函数的概念 1.定义   ①在C语言中,函数是......