C语言动态分配内存

导读:本篇文章讲解 C语言动态分配内存,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

不同数据在内存中分配说明

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

C语言动态分配内存

 动态内存分配

头文件#include<stdlib.h>声明了四个关于内存动态分配的函数

函数原型void * malloc(unsigned int size)

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

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

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

函数原型void  free(*p)

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

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

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

返回类型说明

        C99标准把以上malloc,calloc,realloc函数的基类型定位void类型,这种指针称为无类型指针,即不指向哪一种具体的类型数据,只表示用来指向一个抽象类型的数据,即仅提供一个纯地址,而不能指向任何具体的对象

void指针类型

        C99允许使用基类型为void的指针类型。可以定义一个基类型为void的指针变量(即void *型变量),它不指向任何类型的数据(指向空类型)。在将它的值赋给另一指针变量时由系统对它进行类型转换,使之适合于被赋值的变量的类型

C语言动态分配内存

         当把void指针赋值给不同基类型的指针变量时,C99编译系统会自动进行转换,不用用户自己进行转换

p3=&a;
//相当于p3=(void *)&a;
//赋值后p3得到a的纯地址,但并不指向a,不能通过*p3输出a的值

动态分配内存实例

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

#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>

int main() {
	void check(int *);
	int * p,i;
	//printf("p指针指向的空间为%p", *p);//输出错误,因为此时指针还未指向具体地址
	// 在堆区开辟一个 5 * 4 的空间,并将地址 (void *) , 转成  (int *) , 赋给 p

	p = (int *)malloc(5*sizeof(int));//可以不必使用(int *)进行强转,C99可以直接将void * 转化为int *
	printf("p指针指向的空间为%p\n", p);
	for( i = 0; i < 5; i++){
		scanf("%d", p + i);
		printf("p指针指向第%d个字节的地址为%p\n",i+1, 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]);
		}
	}
}

C语言动态分配内存

C语言动态分配内存

 动态分配内存的基本原则

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

C语言动态分配内存 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/83260.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!