使用内存管理函数实现动态数组

C语言提供了一些内存管理函数,这些内存管理函数可以按需要动态地分配内存空间,也可把不再使用的空间释放,为有效地使用内存资源提供了手段。

动态数组,指的就是利用内存的申请和释放函数,在程序的运行过程中,根据实际需要指定数组的大小。其本质就是一个指向数组的指针变量。

主要用到的内存管理函数是:malloc和free。

1、分配内存函数malloc:

调用形式:(类型说明符*)malloc(size);

功     能:在内存的动态存储区中分配一块长度为size字节的连续区域。

返     回:该区域的首地址。

“类型说明符”表示把该区域用于何种数据类型。

“(类型说明符*)”表示把返回值强制转换为该类型指针。

“size”是一个无符号数。

例如,pc = (char *)malloc(100);表示分配100个字节的内存空间,并强制转换为字符数组类型,函数的返回值为指向该字符数组的指针。

2、释放内存空间函数free:

调用形式:free(void *ptr);

功     能:释放ptr所指向的一块内存空间。ptr是一个任意类型的指针变量,它指向被释放区域的首地址。

 

实现一维动态数组程序框架:

int num;   //要创建一个大小为num的一维数组,num由用户输入或其他方式获得

int *array;   //创建一维指针来指向一维数组

array = (int *)malloc(sizeof(int) * num);   //动态创建一个大小为num的整形一维数组

if(array == NULL)

{

         printf(“out of memory, press any key to quit…\t”);

         exit(0);
     }

…   //使用动态数组

free(array);   //释放由malloc申请的内存空间

 

实现二维动态数组程序框架:

int i;

int row, col;   //要动态创建一个行数为row,列数为col的二维数组,row和col由用户输入或其他方式获得

int **array;   //创建二维指针来指向二维数组

array = (int **)malloc(sizeof(int *) * row);    //动态创建一个大小为row×col的整形二维数组

for(i=0; i<row; i++)

{

         array[i] = (int *)malloc(sizeof(int) * col);
     }

…   //使用动态数组

for(i=0; i<row; i++)

{

         free(array[i]);   //先释放一维指针

}

free(array);   //最后释放二维指针

使用内存管理函数实现动态数组,布布扣,bubuko.com

时间: 2024-08-06 07:58:27

使用内存管理函数实现动态数组的相关文章

Delphi 的内存操作函数(2): 给数组指针分配内存

静态数组, 在声明时就分配好内存了, 譬如: var   arr1: array[0..255] of Char;   arr2: array[0..255] of Integer; begin   ShowMessageFmt('数组大小分别是: %d.%d', [SizeOf(arr1), SizeOf(arr2)]);   {数组大小分别是: 512.1024} end; 对静态数组指针, 虽然在声明之处并没有分配内存, 但这个指针应该分配多少内存是有定数的. 这种情况, 我们应该用 Ne

Linux C 堆内存管理函数malloc(),calloc(),realloc(),free()详解

C 编程中,经常需要操作的内存可分为下面几个类别: 堆栈区(stack):由编译器自动分配与释放,存放函数的参数值,局部变量,临时变量等等,它们获取的方式都是由编译器自动执行的 堆区(heap):一般由程序员分配与释放,基程序员不释放,程序结束时可能由操作系统回收(C/C++没有此等回收机制,Java/C#有),注意它与数据结构中的堆是两回事,分配方式倒是类似于链表. 全局区(静态区)(static):全局变量和静态变量的存储是放在一块儿的,初始化的全局变量和静态变量在一块区域,未初始化的全局变

cortex_m3_stm32嵌入式学习笔记(二十四):内存管理实验(动态内存)

有用过C语言编程的童鞋对动态管理内存肯定有点了解..好处就不多说了 今天实现STM32的动态内存管理 内存管理,是指软件运行时对计算机内存资源的分配和使用的技术.其最主要的目的是如何高效,快速的分配,并且在适当的时候释放和回收内存资源. 内存管理的实现方法有很多种,他们其实最终都是要实现两个函数:malloc 和 free(好熟悉): malloc 函数用于内存申请, free 函数用于内存释放. 实现方式:分块式内存管理 从上图可以看出,分块式内存管理由内存池和内存管理表两部分组成.内存池被等

C#有关数组内存的释放及动态数组问题

一.数组内存释放问题 数组内存的释放可以按照如下语句实现: string [] aa=new string[2]; aa[0]="A"; aa[1]="B"; aa=null; 其中最后一句:aa=null就是释放内存的. 二.关于动态数组 动态数组可以按以下方式申明: string[,] aa; 然后在任何要使用该数组的地方,都可以重新定义数组的大小: aa=new string[2,3];

Kernel 3.0.8 内存管理函数【转】

转自:http://blog.csdn.net/myarrow/article/details/7208777 1. 内存分配函数 相关代码如下: #define alloc_pages(gfp_mask, order)   alloc_pages_node(numa_node_id(), gfp_mask, order)#define alloc_page_vma(gfp_mask, vma, addr) alloc_pages(gfp_mask, 0)#define alloc_page(g

内存管理函数

1 calloc函数 [函数原型]:void* calloc (size_t num, size_t size); [功能]: 在内存中动态地分配 num 个长度为 size 的连续空间,并将每一个字节都初始化为 0: [返回值]: 分配成功返回指向该内存的地址,失败则返回 NULL: [头文件]: #include <stdlib.h> 如果 size 的值为 0,那么返回值会因标准库实现的不同而不同,可能是 NULL,也可能不是,但返回的指针不应该再次被引用. 注意:函数的返回值类型是 v

PoolManager 内存管理池,动态加载

public class MyPoolTest : MonoBehaviour { private SpawnPool spawnPool; private PrefabPool refabPool; void init(){ spawnPool  = PoolManager.Pools.Create("aabb"); spawnPool  = PoolManager.Pools.Create("aabb"); spawnPool.group.parent = th

【转】内存管理

GlobalAlloc是标准内存管理函数,标准内存管理函数都是操作进程的默认堆,所以这个函数是从进程的从进程的默认堆中分配内存空间,分配的空间可以是可移动的也可以是不可以移动的.可移动的内存是指windows在需要的时候可以将这个内存移动到另外一个地址         HeapAllock是堆管理函数,堆管理函数可以操作非默认堆(当然也可以操作默认堆),创建一个堆是用HeapCreate,这个函数返回一个堆句柄,然后可以用在HeapAllock函数中,即从返回的这个堆中申请内存空间,HeapAl

FreeRTOS高级篇7---FreeRTOS内存管理分析

内存管理对应用程序和操作系统来说都非常重要.现在很多的程序漏洞和运行崩溃都和内存分配使用错误有关.        FreeRTOS操作系统将内核与内存管理分开实现,操作系统内核仅规定了必要的内存管理函数原型,而不关心这些内存管理函数是如何实现的.这样做大有好处,可以增加系统的灵活性:不同的应用场合可以使用不同的内存分配实现,选择对自己更有利的内存管理策略.比如对于安全型的嵌入式系统,通常不允许动态内存分配,那么可以采用非常简单的内存管理策略,一经申请的内存,甚至不允许被释放.在满足设计要求的前提