C动态分配

news/2024/10/22 11:42:32/

动态分布与静态发布:

静态分配

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

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

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

      4、 按计划分配。

动态分配

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

      2、按需分配。

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

动态内存分配函数

1.malloc函数

该函数仅针对于指针使用,使用前需要引用malloc.h函数

void * malloc (unsigned int size)

  • 参数size:

  • size:要开辟的空间的大小

  • 返回值:

  • 成功:开辟好的空间的首地址

  • 失败:NULL

在内存的动态存储区(堆)中分配一个长度为size的连续空间。其参数是一个无符号整数,返回值是一个系统所分配的连续内存空间的起始地址

若分配内存空间失败(如内存不足等原因)则返回NULL。所以,使用前一定要判断是否为NULL

#include <stdio.h>
#include <stdlib.h>
int main(){int num;scanf("%d",&num);int *ptr=(int *)malloc(num*sizeof(int));if(ptr==NULL){printf("内存分配失败!\n");exit(1);}else {printf("success!");}for(int i=0;i<num;i++){scanf("%d",&ptr[i]);}for(int i=0;i<num;i++){printf("%d ",ptr[i]);}putchar('\n');free(ptr);return 0;
}

2.free函数

    #include <stdlib.h>
     void free(void *p)
     功能:释放堆区的动态内存空间
     参数:
     ptr:开辟后使用完毕的堆区的空间的首地址
     返回值:
     无

注意:

  •       free函数只能释放堆区的空间,其他区域的空间无法使用free
  •       free释放空间必须释放malloc或者calloc或者realloc的返回值对应的空间,不能说只释放一部分
  •      free(p); 注意当free后,因为没有给p赋值,所以p还是指向原先动态申请的内存。但是内存已经不能再用了,p变成野指针了,所以一般为了放置野指针,会free完毕之后对p赋 为NULL
  •       一块动态申请的内存只能free一次,不能多次free。

    //使用free函数释放空间
    ferr(p);
    //防止野指针
    p=NULL;

链表的基本概念

链表,是为了实现动态保存一串数据。注意这里的动态是指不需要预先分配内存空间,而是在需要时动态申请内存。整个数据串保存所需的空间可以根据需要扩大或缩小。而设计的一种数据结构。如:

链表的节点结构

1.数据域:用来储存数据

2.指针域:储存下一个节点元素的地址

如果有后继元素,则指针link会指向下一个元素,若无,这指针指向NULL

struct Stu{char name[20];int age;struct Stu *link;
}


http://www.ppmy.cn/news/1099104.html

相关文章

B Antiamuny wants to leaern binary search again

题目&#xff1a; C/C: int f(int l,int r,int x) { // l < x < rint cnt 0;while(l < r) {cnt;int mid (l r) / 2;if (mid x) break;if (mid < x) l mid 1;else r mid - 1;}return cnt; } 样例&#xff1a; 输入 5 3 7 2 6 12 2 2 10 3 6 14 8 5 8 1 输…

vue3+ts 分享海报

安装依赖1. npm install html2canvas --save<div class"flex-box"><div><div v-for"(item,index ) in from.list" :key"index" click"actvieFuntion(index)"><div>{{item}}</div><div :class"…

Revit SDK 介绍:PrintLog 打印日志

前言 这个例子介绍了如何使用打印相关的事件。 内容 事件机制也是老生常谈了&#xff0c;Revit 提供了大量的可供注册的事件&#xff1a;Revit API&#xff1a;Events 事件总览 注册和 print 相关的事件&#xff1a; // IExternalApplication.OnStartup m_eventsReactor …

单片机电子元器件-按键

电子元器件 按键上有 四个引脚 1 2 、 3 4 按下之后 导通 1 3 、 2 4 初始导通 通常按键开关为机械弹性开关&#xff0c;开关在闭合不会马上稳定的接通&#xff0c;会有一连串的抖动 抖动时间的长短有机械特性来决定的&#xff0c;一般为5ms 到10 ms 。 消抖的分类 硬件消…

深浅拷贝与赋值

数据类型 数据类型 在JavaScript中&#xff0c;数据类型有两大类。一类是基本数据类型&#xff0c;一类是引用数据类型。 基本数据类型有六种&#xff1a;number、string、boolean、null、undefined、symbol。 基本数据类型存放在栈中。存放在栈中的数据具有数据大小确定&a…

【Python 程序设计】Python 中的类型提示【06/8】

目录 一、说明 二、什么是动态类型&#xff1f; 2.1 为什么要使用类型提示&#xff1f; 2.2 局限性 三、基本类型提示 3.1 声明变量的类型 3.2 函数注释 四、Python 中的内置类型 4.1 原子类型与复合类型 五、函数注释 5.1 如何指定函数的参数类型和返回类型 5.2 在函数签名中…

Jdk1.7之ConcurrentHashMap源码总结

文章目录 一、常见属性1. 初始化容量2. 加载因子3. 并发级别 二、重要方法1. 构造方法2. ConcurrentHashMap#put方法2.1 ConcurrentHashMap#put#ensureSegment2.2 ConcurrentHashMap#Segment#put2.2.1 Segment#put#scanAndLockForPut2.2.2 Segment#put#rehash 3. ConcurrentHas…

CentOS 7 调优之周期性的访问中断

文章目录 背景问题描述原因分析解决方案相关版本 背景 操作系统版本&#xff1a;CentOS Linux release 7.6.1810 (Core) 操作系统镜像安装后&#xff0c;未进行任何调整。正常部署应用&#xff0c;应用在 CentOS 7.9 未出现过此类现象。 问题描述 问题描述&#xff1a;负载教…