malloc()
函数原型为void *malloc(unsigned int size);
malloc()函数接受一个参数:所需的内存字节数。malloc()函数会找到合适的空闲内存块,这样的内存是匿名的。也就是说,malloc()分配内存,但是不会为其赋名。然而,它确实返回动态分配内存块的首字节地址。因此,可以把该地址赋给一个指针变量,并使用指针访问这块内存。
从ANSI C标准开始,C使用一个新的类型:指向void的指针。该类型相当于一个“通用指针”。malloc()函数可用于返回指向数组的指针、指向结构的指针等,所以通常该函数返回值会被强制转换为匹配的类型。在ANSI C中,应该坚持使用强制类型转换,提高代码的可读性。然而,把指向void的指针赋给任意类型的指针完全不用考虑类型匹配的问题。
如果malloc()分配内存失败,将返回空指针。
double * ptd;
ptd = (double*) malloc(30 * sizeof(double));
在C中,不一定要使用强制类型转换(double *),但是在C++中必须使用。
以上代码为30个double类型的值请求内存空间,并设置ptd指向该位置。让ptd指向这个块的首元素,便可像使用数组名一样使用它。也就是说,可以使用表达式ptd[0]访问该块的首元素,ptd[1]访问第二个元素。
通常,malloc()要与free()配套使用。free()函数的参数是之前malloc()返回的地址,该函数释放之前malloc()分配的内存。
free()的重要性
void free(void *ptr);
静态内存的数量在编译时是固定的,在程序运行期间也不会改变。自动变量使用的内存数量在程序执行期间自动增加或减少。但是动态分配的内存数量只会增加,除非用free()进行释放。(一些操作系统在程序结束时会自动释放动态分配的内存,但是有些系统不会。)
如果耗尽了所有的内存,这类问题称为**内存泄漏**(memory leak)。调用free()函数可避免这类问题的发生。
calloc()
函数原型:void* calloc(unsigned int num,unsigned int size);
long * newmem;
newmem = (long *)calloc(100, sizeof(long));
calloc()函数接受两个无符号整数作为参数(ANSI 规定是size_t类型)。第一个参数是所需的存储单元数量,第二个是存储单元的大小(以字节为单位)。
calloc()函数还有一个特性:他把块中的所有位都设置为0(注意,在某些硬件系统中,不是把所有位都设置为0来表示浮点值0)。