1.malloc()的简介
1.1 定义
C语言中可以使用malloc()进行动态内存分配。
1.2 作用
malloc()根据参数指定的尺寸来分配内存快,它返回指向内存快初始位置的指针。
1.3 应用
经常用于动态分配结构体的内存领域、分配执行前还不知道大小的数组的内存领域等。
1.4 基本使用方法
p = malloc(size);
一旦内存分配失败,malloc()将返回NULL。利用malloc()分配的内存结束使用后,通过free()释放内存。
free(p); //释放p指向的内存区域
1.5 扩展
像这样能够动态地(运行时)进行内存分配,并且可以通过任意的顺序释放的记忆区域,称为堆(heap)。
2.使用范例
2.1 动态分配结构体
假设要用下面的结构体管理一本书的数据:
typedef struct{
char title[64];
int price;
char isbn[32];
//等等
}BookDate;
通过下面的方式,就可以在运行时分配BookData的内存区域:
BookData *book_data_p;
//分配一个结构体BookData的内存区域
book_data_ = malloc(sizeof(BookData));
如果使用 链表来管理,就可以保持任意个数的BookData。
2.2 分配可变长数组
在刚才的BookData类型中,书名是这样的:
char title[64];
可是有时候书名太长,这个数组就放不下了。可是,准备太长的数组又浪费的内存空间。
这里可以这样解决:
//将titile的声明写成这样:
char *title;
//然后,
BookData *book_data_p;
//等等
book_data_p->title = malloc(sizeof(char) * len); //len为标题字符数+1
3. malloc()返回值的类型为void*
ANSI C中,malloc()的返回值类型为void*,void*类型的指针可以不强制转型地赋给所有的指针类型变量。因此
book_data_p = (BookData*)malloc(sizrof(BookData));
可以写成
book_data_p = malloc(sizrof(BookData));
4.malloc()不是「系统调用」。
malloc()是属于标准库函数的,不属于系统调用。
参考资料:
前桥和弥, 吴雅明. 征服C指针[M]. 人民邮电出版社, 2013.