动态内存分配(malloc)详解

您所在的位置:网站首页 单片机动态内存分配 动态内存分配(malloc)详解

动态内存分配(malloc)详解

2024-07-13 17:07| 来源: 网络整理| 查看: 265

文章目录 mallocfree ( )calloc( )动态内存分配与变长数组内存类与动态内存分配

malloc malloc()找到可用内存中一个大小适合的块。 内存是匿名的; 也就是说,malloc()分配了内存,但没有为它指定名字。 然而,它却可以返回那块内存第一个字节的地址。 因此,可以把那个地址赋值给一个指针变量,并使用该指针来访问那块内存。 因为char代表一个字节,所以传统上曾将malloc()定义为指向char的指针类型。 然而,ANSIC标准使用了一个新类型:指向void的指针。这一类型被用作“通用指针”。 函数malloc()可用来返回数组指针、结构指针等等,因此一般需要把返回值的类型指派为适当的类型。 在ANSIC中,为了程序清晰应对指针进行类型指派,但将void 指针值赋值给其他类型的指针并不构成类型冲突。 如果malloc()找不到所需的空间,它将返回空指针。 我们使用malloc()来创建一个 数组。可以在程序运行时使用malloc()请求一个存储块,另外还需要一个指针来存放该块在内存中的位置。 例如,如下代码: double * ptd; ptd = (double * ) malloc (30 * sizeof(double));

这段代码请求30个double类型值的空间,并且把ptd指向该空间所在位置。 注意:ptd是作为指向一个double类型值的指针声明的,而不是指向30个double类型值的数据块的指针。 记住:数组的名字是它第一个元素的地址。 因此,如果令ptd指向一个内存块的第一个元素,就可以像使用数组名一样使用它。 也就是说,可以使用表达式ptd[0]来访问内存块的第一个元素,pd[1]来访问第二个元素,依此类推。 正如前面所学,可以在指针符号中使用数组名,也可以在数组符号中使用指针。

现在,创建一个数组有三种方法: 1.声明一个数组,声明时用常量表达式指定数组维数,然后可以用数组名访问数组元素。 2.声明一个变长数组,声明时用变量表达式指定数组维数,然后用数组名来访问数组元素(这是C99的一个特性)。 3.声明一个指针,调用malloc(),然后使用该指针来访问数组元素。

使用第二种或第三种方法可以做一些用普通的数组声明做不到的事: 创建一个动态数组(dynamic array),即一个在程序运行时才分配内存并可在程序运行时选择大小的数组。 例如,假定n是一个整数量。在C99之前,不能这样做:

double item[n]:/*如果n是一个变量,C99之前不允许这样做*/

然而,即使在C99之前的编译器中,也可以这样做:

ptd =(double*)malloc(n*sizeof(double));/*可以*/

这行得通,而且正如您将看到的那样,这样做比使用一个变长数组更灵活。

一般地,对应每个malloc()调用,应该调用一次free()。 函数free()的参数是先前malloc()返问的地址,它释放先前分配的内存。

这样,所分配内存的持续时间从调用malloc()分配内存开始,到调用free()释放内存以供再使用为止。

设想malloc()和free()管理着一个内存池。 每次调用malloc()分配内存给程序使用,每次调用free()将内存归还到池中,使内存可被再次使用。

注意:

free()的参数应是一指针,指向由malloc()分配的内存块;其他方式(例如声明一个数组)分配的内存是不能使用free()去释放的。

在头文件stdlib.h中有malloc()和free()的原型。(我不知道,哈哈)

通过使用malloc(),程序可以在运行时决定需要多大的数组并创建它。

程序清单12.14 举例证明了这可能。

它把内存块地址赋给指针ptd,接着以使用数组名的方式使用ptd。

程序还调用了exit()函数。该函数的原型在 stdlib.h 中,用来在内存分配失败时结束程序。

值 EXIT_FAILURE 也在这个头文件中定义。标准库提供了两个保证能够在所有操作系统下工作的返回值: EXIT SUCCESS(或者,等同于0)指示程序正常终止; EXIT_FAILURE指示程序异常终止。 另外,有些操作系统,包括UNIX、Linux 和Windows,能够接受其他的整数值。

程序清单12.14 dyn_arr.c 程序

/*dyn_arr.c -- 为数组动态分配存储空间*/ #include #include int main(void) { double* ptd; int max; int number; int i = 0; puts ("What is the maximum number of type double entries?" ); //entries:entry 输入 scanf("%d", &max);//输入个数 ptd = (double*)malloc(max * sizeof(double)); if (ptd == NULL) { exit(EXIT_FAILURE); } ///*ptd现在指向有max个元素的数组*/ puts("Enter the values(q to quit):"); while (i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3