-
2020-12-23 23:08:42
#include main()
{
int count,*array;
if((array(int *) malloc(10*sizeof(int)))==NULL)
{
printf("不能成功分配存储空间。");
exit(1);
}
for (count=0;count〈10;count++)
array[count]=count;
for(count=0;count〈10;count++)
printf("%2d",array[count]);
}
上例中动态分配了10个整型存储区域,然后进行赋值并打印。例中if((array(int *)
malloc(10*sizeof(int)))==NULL)语句可以分为以下几步:
1)分配10个整型的连续存储空间,并返回一个指向其起始地址的整型指针
2)把此整型指针地址赋给array
3)检测返回值是否为NULL
2、free函数
由于内存区域总是有限的,不能不限制地分配下去,而且一个程序要尽量节省资源,所以当所分配的内存区域不用时,就要释放它,以便其它的变量或者程序使用。这时我们就要用到free函数。
其函数原型是:
void free(void *p)
作用是释放指针p所指向的内存区。
其参数p必须是先前调用malloc函数或calloc函数(另一个动态分配存储区域的函数)时返回的指针。给free函数传递其它的值很可能造成死机或其它灾难性的后果。
注意:这里重要的是指针的值,而不是用来申请动态内存的指针本身。例:
int *p1,*p2;
p1=malloc(10*sizeof(int));
p2=p1;
……
free(p2)
malloc返回值赋给p1,又把p1的值赋给p2,所以此时p1,p2都可作为free函数的参数。
malloc函数是对存储区域进行分配的。
free函数是释放已经不用的内存区域的。
所以由这两个函数就可以实现对内存区域进行动态分配并进行简单的管理了。
更多相关内容 -
C++ 动态分配内存的好处
2020-05-16 20:26:47实例化一个类有两种方式: // 假设有一个类A ...方式二则是在堆区(动态内存,大小任意,手动释放)分配一块内存,然后用指针a去指向这块内存; 那么我们很容易就知道为什么要使用动态内存分配来实例化实例化一个类有两种方式:
// 假设有一个类A // 方式一:直接定义法 A a; // 方式二:动态内存分配法 A * a = new A();
两者有什么差别呢?
实际上,方式二即等价于如下代码:A * a = new A(); 等价于 A * a; a = new A();
方式一就是直接将a放入栈区(局部变量,大小受限,自动释放);
方式二则是在堆区(动态内存,大小任意,手动释放)分配一块内存,然后用指针a去指向这块内存;
那么我们很容易就知道为什么要使用动态内存分配来实例化一个类。
原因:
1.可以动态的申请空间,以便动态确定对象所需要的内存; 2.便于储存大型对象,通常情况下栈区的大小容不下过于庞大的对象; 3.传递指针比传递整个对象更方便高效;(当然对于一个变量也可以取地址,但是临时变量的地址是不能长久使用的,特别是返回临时变量的地址是大忌) 4.同时传递指针可以便于大家共同维护一个空间,指针在传递的过程中,大家都可以修改指针指向的内容,当然要加锁进行保护,这样一处修改,处处修改,否则就要设置全局的变量,大家统一修改使用;
举几个生动形象的例子解释以上三条原因:
1. 每个人都要吃盐,盐不够了再去买显然比把这辈子要吃的盐一次性买下来要明智;
2. 如果你是卖盐的,储存了很多盐,你只需要建一个仓库把盐放进去,然后自己记住仓库地址即可,而不需要把盐全部放在自己的家中;
3. 如果要去很远的地方谈卖盐的生意,只需要选一些有代表性的信息(地址)给对方就可以了,不需要把整个仓库搬过去给对方看。4.比如a,b,c三个人一起卖盐,然后都知道仓库的地址,然后A卖的时候,知道地址就可以把盐取走,仓库里的盐变少了,这样b和c的仓库都被修改了,这样就达到了一个一处修改,处处修改,如果不是指针,而是给三个人都有一个全量的仓库,那么一个修改,另外两个不会修改。想到达统一,就得一个人修改,后再通知另外两个盐变少了多少。
-
C语言动态内存分配
2021-05-23 04:17:49一、动态内存分配原理当我们想突破函数内局部变量的作用域局限,完全拥有由我们自己控制生死的内存地址(由指针指向的),这时候,你可以声明一个指针,让指针指向使用神奇的malloc 函数申请的“活”(动态)内存,申请...一、动态内存分配原理
当我们想突破函数内局部变量的作用域局限,完全拥有由我们自己控制生死的内存地址(由指针指向的),
这时候,你可以声明一个指针,让指针指向使用神奇的malloc 函数申请的“活”(动态)内存,
申请时,记得告诉malloc 你需要的内存大小(指针指向变量所占内存空间大小),
这样,你就可以像往常一样操作指针使用这段内存了,
不同的是,它的生死完全由你控制,让它消失,你只要 free 它。
二、实例说明
//定义一个固定数组,赋值0-9:
int main(){
int a[10];
int i;
for(i = 0; i < 10; i++){
a[i] = i;
}
for(i = 0; i < 10; i++){
printf("a[%d] = %d\n",i,a[i]);
}
return 0;
}
上面的代码是一个数组:0,1,2,3,4,5,6,7,8,9
我们通过动态内存来实现:
//分配一个动态内存,10个整型数的空间,每个空间也赋值,实现跟上相同的功能:
//局部变量,值传递完,函数的栈内存空间也跟着释放掉
//而动态内存空间不会,除非手动释放掉,相当于全局变量。
int main(){
int *p = NULL;
p = malloc(sizeof(int) * 10); //分配一个40字节的内存
for(int i = 0; i < 10; i++){
*(p+i) = i; //指针根据i值来自增 写成 p[i] = i;也是一样
}
for(int i = 0; i < 10; i++){
printf("%d\n",*(p+i));
}
return 0;
}
上面的代码实现的功能跟前面的一模一样。
还有个好处就是完全拥有由我们自己控制,可以随便修改内存的大小:
int main(){
int *p = NULL;
p = malloc(sizeof(int) * 10);
int count = 15; //可以通过改变count的值来改变分配内存的大小
free(p); //释放内存
p = malloc(sizeof(int) * count);
for(int i = 0; i < count; i++){
*(p+i) = i;
}
for(int i = 0; i < count; i++){
printf("%d\n",*(p+i));
}
return 0;
}
-
动态分配内存
2019-08-21 16:31:09int int_value = 100; int& ref = int_value;//对变量的引用 const double& ref2 = 100;//对常量的引用,应用必须初始...//分配内存 delete ptr_int;//释放内存,new与delete成对出现 #include <iost...int int_value = 100; int& ref = int_value;//对变量的引用 const double& ref2 = 100;//对常量的引用,应用必须初始化,引用就是起一个别名
int *ptr_int = new int;//分配内存 delete ptr_int;//释放内存,new与delete成对出现
#include <iostream> using namespace std; int main() {//初始值空指针 int num[5]; int *num_int = new int[5];//new返回第一个元素的地址 cout << sizeof(num) << "\t" << sizeof(num_int) << endl; delete []num_int ;//释放整个数组 return 0; }
分析:int num[5];在编译阶段就已经创建,
int *num_int = new int[5];在运行阶段分配内存 -
如何在Python中动态分配内存
2020-12-19 14:29:51changing blist affects alist blist.append('coffee') # alist and blist both point to # ['eggs', 2, 'juice', 'coffee'] 如果愿意的话,可以预先分配大小,但这通常不会给python带来多大好处。以下内容有效:... -
C语言动态内存分配分析
2021-05-18 11:15:33一:传统数组(静态数组)的缺点1:数组的长度必须事先指定,并且是常整数,不能是变量 int a[5];2:传统数组程序员无法由程序员释放,只能由系统释放。...区分:静态存储与内存的静态开辟二:为什么要动态分配内存... -
C++基础动态内存分配好处
2020-03-18 00:23:53一、为什么要使用动态内存分配 二、动态内存分配作用 1.按照需要分配,根据需要内存分配,造成不浪费。当程序用完之后一定要记得及时释放,不然可能会照成内存泄漏。 C++内存分配和释放。 C语言内存分配和释放 ... -
动态内存分配
2021-09-29 08:43:58什么是动态内存分配? 1.动态内存分配函数的介绍及注意事项: malloc() 原型:void*malloc(size_tsize); 作用:在堆区分配size字节的内存空间。 返回值:成功返回分配的内存地址,失败则返回NULL。 注意:... -
动态内存分配和静态内存分配相关辨析
2021-08-18 14:21:40动态内存分配和静态内存分配 1.什么是静态内存分配和动态内存分配 主要体现在时间和空间的不同。静态内存分配是在程序执行之前,由编译器在程序编译阶段实现的,动态内存分配是在程序执行时由程序完成。。静态内存... -
C和C++动态内存分配与内存泄漏
2021-05-16 17:58:13C和C++动态内存分配与内存泄漏 一般的文章或教程在介绍动态内存分配这个概念的时候,会强调动态内存分配是在程序运行时根据需要对一个变量分配和...在下面这段代码里,数组变量 array占用的内存也是动态分配的,和上面 -
浅谈动态内存分配的意义
2020-12-17 14:54:25在复习数组的时候,我看到可以用一个变量N来定义数组长度,即a[N],我有点纳闷,既然数组长度可以是变量,为什么会有动态内存分布这种用法去malloc一个内存而创造数组,参考以下两段代码,两个程序运行起来的效果看... -
C语言之动态内存分配总结
2022-01-23 09:23:45一、为什么存在动态内存分配 二、动态内存函数的介绍 1.malloc和free 2.calloc 3.realloc 三、常见的动态内存错误 1.对NULL指针进行解引用操作 2.对动态开辟空间的越界访问 3.对非动态开辟内存使用free释放 ... -
C语言动态内存分配之malloc与realloc区别
2021-01-20 03:33:37在程序的执行期间分配内存时,内存区域中的这个空间称为堆(heap)。还有另一个内存区域,称为栈(stack),其中的空间分配给函数的参数和本地变量。在执行完该函数后,存储参数和本地变量的内存空间会释放。堆中的内存... -
JVM----堆上为对象动态分配内存
2019-09-29 14:20:53jvm中内存划分: 如上图,一共分为五块,其中: 线程共享区域为: ... java技术体系中锁提倡的自动内存管理归结为自动化的... (1)给对象分配内存 (2)回收给对象分配的内存(关于回收算法请另见http://w... -
动态内存分配(介绍和使用方法)
2022-01-27 17:14:10动态内存分配介绍 动态内存分配,顾名思义就是可以使我们更加灵活的运用和分配内存, -
顺序表--动态内存分配
2021-05-28 23:08:341、空指针(NULL)。...动态分配内存 在C语言中,我们常常通过malloc函数为一个野指针分配内存。 int *p;//没有为指针分配内存,此时的指针我们称之为野指针。 p = (int *)malloc(sizeof(int )*Max_siz -
C语言 关于内存动态分配问题
2021-05-22 16:34:55在存储区中称为栈(stack)临时数据(C允许内存动态分配区域):存放在自由空间区,称为堆区(heap)内存动态分配 得益于四个库函数实现 (malloc calloc free realloc)调用库函数 void * 不指向任何数据,只提供地址。... -
FreeRTOS——静态与动态内存分配
2021-07-27 14:17:52FreeRTOS V9.0.0及以上版本提供了应用程序设计者自己提供内存的能力,允许可选地创建以下对象而不需要动态分配内存: 任务 软件计时器 队列 事件组 二进制信号量 计数信号量 互斥量 递归互斥量 使用静态内存分配... -
C++动态内存分配问题
2021-05-12 11:37:06动态内存分配问题 动态内存分配问题:c中供程序使用的储存空间,有程序区,静态储存区,动态储存区。 c++中,我们把内存进一步详细分为5个区域; (1)栈:一般函数内的局部函数都会放在这里,由编译器自动分和释放... -
动态内存分配原理------brk()和mmap()详解
2020-03-11 20:22:41从操作系统角度来看,进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap(不考虑共享内存)。 1、brk是将数据段(.data)的最高地址指针_edata往高地址推; 2、mmap是在进程的虚拟地址空间中(堆和栈中间,... -
动态内存分配实现冒泡排序
2022-01-03 10:25:18if((p=(int *)calloc(n,sizeof(int)))==NULL) //申请空间 { printf("分配内存失败!\n"); return 0; } printf("请输入n个数:\n"); for(i=0;i(*(p+j+1))) //实现冒泡排序 { swap(p+j,p+j+1); } } } for(i=0;i 实现... -
C++使用new分配内存,动态数组,delete释放new的内存
2021-10-07 19:20:16指针变量必须指定一个具体的地址,要么指定一个变量的地址,要么new 个新地址 ...指针的真正用武之地在于,在运行时动态分配未命名的内存。此时,只能用指针来访问内存-----new运算符 格式: typena.. -
C语言结构体数组指针的动态分配
2020-03-03 23:44:28于是,我们换一种方法,就是采用动态分配的方式。当程序解析出具体的设备类型后,在通过malloc函数,动态申请一块内存,供设备属性和数值的缓存使用。代码如下: int main(void) { void *pDevShadow; //刚开始... -
C/C++ 内存分配方式,内存分类方式;动态分配内存和栈的比较
2014-05-23 14:59:09另外,在 WINDOWS 下,最好的方式是用 VirtualAlloc 分配内存,他不是在堆,也不是栈,而是直接在进程的地址空间中保留一快内存,虽然用起来最不方便。但是速度快,也最灵活。 5 堆和栈中的存储内容 栈:... -
STM32动态内存分配
2014-03-19 08:17:31//限制,在某些情况下[比如分配内存给结构体指针],可能出现错误,所以一定要加上这个; __align(4) u8 membase[MEM_MAX_SIZE]; //内部SRAM内存池 //内存管理表 u16 memmapbase[MEM_ALLOC_TABLE_SIZE]; //内部... -
linux动态内存分配-详解
2018-05-22 10:29:35进程可以通过增加堆的大小来分配内存,堆就是一段长度可变的连续的虚拟内存,开始于未初始化数据段末尾,随着内存的分配和释放增减。通常堆的当前内存边界称为program break。最初,program break正好位于未出华数据... -
Java 内存分配
2021-03-06 23:24:24虚拟机栈:虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都会创建一个栈帧用于存储局部变量表,操作栈,动态链接,方法出口等信息。每一个方法被调用的过程就对应一个栈帧在虚拟机栈中从入栈到出栈... -
操作系统-- 连续内存分配、非连续内存分配
2020-04-21 17:45:22文章目录一、连续内存分配1、内存碎片的问题(1)外部碎片(2)内部碎片2、连续内存分配算法(1)首次适配(2)最优适配(3)最差适配3、碎片整理方法4、连续内存分配的缺点二、非连续内存分配1、非连续分配的优点2... -
CSAPP Dynamic Storage Allocator 动态内存分配器
2019-01-14 18:09:04动态内存分配器 专 业 计算机科学与技术 计算机科学与技术学院 mm.c源代码见文章末尾 目 录 第1章 实验基本信息... - 4 - 1.1 实验目的... - 4 - 1.2 实验环境与工具... - 4 - 1.2.1 ... -
如何简单地实现动态内存分配实现?
2021-12-25 00:11:30前言首先要明白为何需要动态内存分配,熟悉C语言的读者应该对这个比较熟悉,需要一段内存时会使用malloc函数来申请所需要大小的内存,函数返回一段内存的首地址。简单来说,动态内存分配的好处在...