首页 > 代码库 > 分配内存malloc和free()

分配内存malloc和free()

所有的程序都必须留出足够的内存来存储它们使用的数据。一些内存分配是自动完成的。在运行时需要分配更多的内存。主要的工具是函数malloc(),它接受一个参数:所需要内存字节数。然后malloc找到可用内存中一个大小合适的块。内存是匿名的;也就是说,malloc()分配了内存,但没有为它指定名字。然而,它却可以返回那块内存第一个字节的地址。因此,可以把那个地址赋值给一个指针变量,并使用该指针来访问那块内存。

char place[] = "Dancing Oxen Creek";
因为char代表一个字节,所以传统上曾将malloc定义为指向char的指针类型。

在ANSI C标准使用中使用了一个新的类型:指向void的指针。这一类型被用作“通用指针”。函数malloc()可用来返回数组指针、结构指针等等,因此一般需要把返回值的类型指派为适当的类型。在ANSI C中,为了程序清晰应对指针进行类型指派,但将void指针值赋值给其他类型的指针并不构成类型冲突。如果malloc()找不到所需要的空间,他将返回空指针。

使用malloc创建一个数组。可以在程序运行时使用malloc()请求一个存储块,另外还需要一个指针来存放该块在内存中的位置。

double * ptd;
ptd = (double *) malloc (30 * sizeof(double));
请求30个double类型值的空间,并且包ptd指向空间所在的位置。

这里的ptd 是作为指向一个double类型值的指针声明,而不是指向30个类型值的数据块的指针。这里的数组的名字是它的第一个元素的地址。

如果令ptd指向一个内存的第一个元素,就可以像使用数组名字一样的使用它了。

也就是说,可以使用表达式ptd[0]来访问一个内存块的第一个元素,ptd[1]访问第二个元素依次类推。可以在指针符号中使用数组名,也可以在数组符号中使用指针。


创建一个数组有3种方式

1、声明一个数组,声明时用常量表达式指定数组维数,然后可以用数组名访问数组元素

2、声明一个变长的数组,声明时用变量表达式指定数组维数,然后用数组名来访问数组元素

3、声明一个指针,调用malloc(),然后使用该指针来访问数组元素。


一般的,对应每个malloc调用,应该调用一个free()。函数free的参数是先前malloc()返回的地址,他释放先前分配的内存。这样所分配的内村的持续时间从调用malloc()分配内存开始,到调用free()释放内存以供再使用为止。设想malloc()free()管理着一个内存池。每次调用malloc()分配内存给程序使用,每次调用free()将内存归还到池中,使内存再次被使用。free()参数应是一个指针,指向有malloc()分配的内存块;不能使用free()来释放通过其他方式分配内存。在头文件stdlib.h中有malloc()和free()的原型。

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

分配内存malloc和free()