动态内存分配与指向它的指针变量

1.动态内存分配的含义

c语言允许建立动态内存分配区域,以存放一些临时用的数据,这些数据不必再程序的声明部分定义,也不必等到函数结束时才释放,而是要随时开辟,不需要随时释放,这些数据是临时存放在一个特定的自由存储区(堆),可以根据需要向系统申请所需要大小的空间,由于未在声明部分定义它们为变量或数组,因此不能通过变量名或数组名去引用这些数据,只能通过指针来引用。

2.建立内存的动态分配

对内存的动态分配是通过系统提供的函数库来实现的,主要有malloc,calloc,free,realloc这四个函数:

(1).使用malloc函数

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

其作用是在内存的动态存储区域中分配一个长度为size的连续空间,形参size的类型定义为无符号整形(不允许为负数)。次函数的值(即返回值)是所分配区域的第一             个字节的地址,或者说,次函数是一个指针型函数,返回的指针指向该分配区域的开头位置,如:

malloc(100)//开辟100字节的临时分配区域,函数值为其第一个字节的地址

注意其指针的基类型为void,即不能执行任何类型的数据,只能提供一个地址,如果此函数未能成功执行(如内存空间不足),则返回空指针。

 (2).使用calloc函数

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

其作用是在内存的动态区域中分配长度为size的连续空间,这个空间一般比较大,足以保存一个数组。

用calloc函数可以为以为数组来开辟动态存储空间,n为数组元素的个数,每个元素的长度为size,这就是动态数组,函数返回所分配区域的其实位置指针;如果分配不           成功,返回NULL。如

p = calloc(50,4);//开辟50X4个字节的临时分配区域,把起始地址赋给指针变量p

(3).使用free函数

其原型为void free(void *p);

其作用是释放指针变量p所指的动态空间,使这部分空间能重新被其他变量使用,p应该是最近一次调用calloc或malloc函数得到的函数返回值,如;

free(p)  //释放指针变零p所指向的已知的分配的动态空间

free函数物返回值

  (4).使用realloc函数

其原型为void *realloc(void *p, unsigned int size);

如果已经通过malloc函数或calloc函数获得了动态空间,向改变其大小,可以用realloc函数重新分配。

用realloc函数将p所指向的动态空间的大小改变为size,p的值不变,如果重新分配不成功,返回NULL 如

realloc(p,50) //将所指的已分配的动态空间该为50个字节

以上4个函数的声明在stdlib.h头文件中,在用到这些函数的时候应用#“include<stdlib.h>”指令把stdlib.h头文件包含到程序文件中

3.void指针类型

C99允许使用基类型为void的指针类型。可以定义一个基类型为void的指针变量(即void*型变量),它不指向任何类型的数据。把void指针赋给不同基类型的指针变量(或相反)时,编译系统会自动的进行转换,不必用户自己进行强制类型转换,如 void *p1; int a = 3;p1 = &a.相当于p1 = (void*)&a;

 例题:建立动态数组,输入5个学生的成绩,另外用一个函数检查其中有无低于60分的,输出不及格的成绩。

解题思路:用malloc函数开辟一个自由区域,用来存5个学生的成绩,会得到这个动态域第一个字节地址,它的基类型是void型,用一个基类型为int的指针变量排来指向动态数组个元素,并输出他们的值,但不许先把函数返回的void指针转换成整形指针,然后赋给p1.程序如下:

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 int main()
 4 {
 5     void check(int *);
 6     int *p1;
 7     //开辟动态内存区,将地址转换为int *型,然后放在p1中
 8     p1 = (int *)malloc(5* sizeof(int));   //p1 = malloc(5*sizeof(int));也可以
 9     for (int i = 0; i < 5; i++)
10         scanf_s("%d",p1+i);//输入5个学生的成绩
11     check(p1);
12     return 0;
13 }
14 void check(int *p)
15 {
16     int i;
17     for (int i = 0; i < 5;i++)
18     if (p[i] < 60) printf("%d ",p[i]);
19     printf("\n");
20 }

程序分析:程序中没有定义数组,而是开辟了一段自由动态分配区,作为动态数组使用,在调用malloc函数时,没有给出具体的值,而是用5*sizeof(int),因为有5个学生的成绩,每个成绩是一个整数,但在不同系统中存放一个整数的字节不同,为了程序具有通用性,故用sizeof运算符测定在本系统中整数的字节数。

时间: 2025-01-11 20:26:12

动态内存分配与指向它的指针变量的相关文章

C语言编程入门——动态内存分配

内存管理,是指软件运行时对计算机内存资源的分配和使用的技术.其最主要的目的是如何高效,快速的分配,并且在适当的时候释放和回收内存资源.内存管理是C语言编程中重要的组成部分,C语言中的内存需要手动分配,手动释放,一般遵循分配多少,释放多少,以免造成内存泄漏.内存管理是一项重要且复杂的事情,理解内存管理,对后面课程及项目的学习会有很大的作用. 之前创建变量,是系统自动分配的内存,放在栈内存中,销毁后被系统自动回收,手动分配的内存,放在堆内存中,需要手动释放.千万不要忘记销毁对象手动将内存释放并将指针

指针 &amp;&amp; 动态内存分配

C++中的动态内存分配机制 c++中使用new和delete来完成在堆上对动态内存的分配和释放. 注.所有指针都应该被初始化 如果指针指向的动态内存被释放或没有指向合法的地址,就应该将指针设置为nullptr,否则内存泄漏. 变量: double* pvalue {}; pvalue=new double; *pvalue=9.0; 或 double* pvalue {}; pvalue=new double {9.0}; 或合并为一句 double* pvalue {new double{9.

C++学习笔记(十一):void*指针、类型转换和动态内存分配

void*指针 void关键字表示“空类型”的概念.但是,这里的“空类型”不表示“任意类型”,而是表示不存在的意思,也就是说C/C++不允许你写语句void a,不存在类型为void的东西. void*表示“空类型指针”,与void不同,void*表示“任意类型的指针”或表示“该指针与一地址值相关,但是不清楚在此地址上的对象的类型”. 类型转换 C风格转换: 1 int i; 2 double d; 3 4 i = (int) d; 5 //或 6 i = int (d); C风格转换在C++中

C和指针 (pointers on C)——第十一章:动态内存分配(上)

第十一章 动态内存分配 数组在声明的时候,本身作为一个指针常量,它在编译时候内存就已经被分配好了.但是有时候程序不知道这个数组到底有多长,所以,为了防止内存的浪费,C提供了动态内存分配的策略. 其实,作为独立的一章,本章显得内容不多.malloc,free,calloc,realloc就没有了,但是它包含很多用法,也有很多陷阱. 总结: malloc和calloc函数都用于动态分配一块内存,并返回一个指向该块内存的指针.malloc返回的是一个 void *的指针. malloc的参数就是需要分

指针做参数的动态内存分配与二重指针(上)

C中的动态内存分配问题: 格式:Int *pointer; Pointer = (int *)malloc(100 * sizeof(int)); 可以在被调用函数(该函数返回指针的函数)中动态分配内存,(并且该内存是分配在堆内存中的,故而被调函数可以返回指向该堆内存的指针),然后返回该指针值,该指针指向动态分配的内存,然后可以在主函数中free掉pointer.哪怕在主函数中将该指针值赋值给pointer_2,free掉pointer_2也是可以的,(可以理解的,它们都指向该堆内存),以避免出

C和C指针小记(十六)-动态内存分配

动态内存分配 1.1 为什么使用动态内存分配 直接声明数组的方式的缺点: 1) 声明数组必须指定长度限制.无法处理超过声明长度的数组. 2) 如果声明更大的常量来弥补第一个缺点,会造成更多的内存浪费. 3)如果输入数组的数据超过来数组的容纳范围,程序必须以一种合理的方式作出响应.但是程序员一般不会做这个判断. 1.2 malloc 和 free malloc 和 free 分别用于执行动态分配内存和释放. stdlib.h 中声明来这两个函数的原型 void malloc( size_t siz

C++动态内存分配

笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解>电子工业出版社等. CSDN视频网址:http://edu.csdn.net/lecturer/144 C / C ++中的动态内存分配是指程序员手动执行内存分配, 动态分配的内存分配给堆,非静态和局部变量获取在Stack上分配的内存.详情查看上篇博文:C程序的内存布局. 什么是应用程序? 动态分配的

【C语言天天练(九)】动态内存分配

引言:数组的元素存储于内存中连续的位置上.当一个数组被声明时.它所须要的内存在编译时就被分配. 可是,我们能够使用动态内存分配在执行时为它分配内存. 一块内存的生命周期能够分为四个阶段:分配.初始化.使用.释放. 内存的分配一般使用C函数库里的malloc函数(原型:void *malloc(size_t size)). 关于malloc函数应该注意一下几点: 1.malloc的參数就是须要分配的内存的字节数. 2.malloc所分配的是一块连续的内存. 3.分配成功.则返回指向分配内存起始地址

SQLite剖析之动态内存分配

SQLite通过动态内存分配来获取各种对象(例如数据库连接和SQL预处理语句)所需内存.建立数据库文件的内存Cache.以及保存查询结果.我们做了很多努力来让SQLite的动态内存分配子系统可靠.可预测.健壮并且高效.本文概述SQLite的动态内存分配,软件开发人员在使用SQLite时可以据此获得最佳性能. 1.特性    SQLite内核和它的内存分配子系统提供以下特性:    (1)对内存分配失败的健壮处理.如果一个内存分配请求失败(即malloc()或realloc()返回NULL),SQ