ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

C语言,动态内存分配 ★★★★★

2021-12-28 12:58:30  阅读:148  来源: 互联网

标签:函数 int void C语言 内存 动态内存 分配 size


文章目录

C 程序中,不同数据在内存中分配说明

1)全局变量——内存中的静态存储区
2)非静态的局部变量——内存中的动态存储区——stack 栈
3)临时使用的数据—建立动态内存分配区域,需要时随时开辟,不需要时及时释放——heap 堆
4)根据需要向系统申请所需大小的空间,由于未在声明部分定义其为变量或者数组,不能通过变量名或者数组名 来引用这些数据,只能通过指针来引用)

在这里插入图片描述

内存动态分配的相关函数

1)头文件 #include <stdlib.h> 声明了四个关于内存动态分配的函数
2)函数原型 void * malloc(usigned int size) //memory allocation

  • 作用——在内存的动态存储区(堆区)中分配一个长度为 size 的连续空间。
  • 形参 size 的类型为无符号整型,函数返回值是所分配区域的第一个字节的地址,即此函数是一个指针型函数, 返回的指针指向该分配域的开头位置。
  • malloc(100); 开辟 100 字节的临时空间,返回值为其第一个字节的地址

3)函数原型 void *calloc(unsigned n,unsigned size)

  • 作用——在内存的动态存储区中分配 n 个长度为 size 的连续空间,这个空间一般比较大,足以保存一个数组
  • 用 calloc 函数可以为一维数组开辟动态存储空间,n 为数组元素个数,每个元素长度为 size.
  • 函数返回指向所分配域的起始位置的指针;分配不成功,返回 NULL。
  • p = calloc(50, 4); //开辟 50*4 个字节临时空间,把起始地址分配给指针变量 p

4)函数原型:void free(void *p)

  • 作用——释放变量 p 所指向的动态空间,使这部分空间能重新被其他变量使用。
  • p 是最近一次调用 calloc 或 malloc 函数时的函数返回值
  • free 函数无返回值
  • free (p ); // 释放 p 所指向的已分配的动态空间

5) 函数原型 void *realloc(void *p,unsigned int size)

  • 作用——重新分配 malloc 或 calloc 函数获得的动态空间大小,将 p 指向的动态空间大小改变为 size,p 的值不 变,分配失败返回 NULL
  • realloc(p, 50); // 将 p 所指向的已分配的动态空间 改为 50 字节

6)返回类型说明
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

应用实例

动态创建数组,输入 5 个学生的成绩,另外一个函数检测成绩低于 60 分的,输出不合格的成绩。

代码演示

#include <stdlib.h>

#include <stdio.h>

int main() {
	void check(int *);
	int * p,i; // 在堆区开辟一个 5 * 4 的空间,并将地址 (void *) , 转成 (int *) , 赋给 p
	p = (int *)malloc(5*sizeof(int));
	for( i = 0; i < 5; i++) {
		scanf("%d", p + i);
	}

	check(p); //

	free(p); //销毁 堆区 p 指向的空间 getchar(); getchar();
	return 0;

}

void check(int *p) {
	int i;
	printf("\n不及格的成绩 有: ");
	for(i =0; i < 5; i++) {
		if(p[i] < 60) {
			printf(" %d ", p[i]);
		}
	}
}

动态分配内存的基本原则

1)避免分配大量的小内存块。分配堆上的内存有一些系统开销,所以分配许多小的内存块比分配几个大内存块的 系统开销大
2)仅在需要时分配内存。只要使用完堆上的内存块,就需要及时释放它(如果使用动态分配内存,需要遵守原则: 谁分配,谁释放), 否则可能出现内存泄漏
3)总是确保释放以分配的内存。在编写分配内存的代码时,就要确定在代码的什么地方释放内存
4)在释放内存之前,确保不会无意中覆盖堆上已分配的内存地址,否则程序就会出现内存泄漏。在循环中分配内 存时,要特别小心
5)指针使用一览

在这里插入图片描述

标签:函数,int,void,C语言,内存,动态内存,分配,size
来源: https://blog.csdn.net/weixin_45417821/article/details/122190086

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有