1、malloc()函數的頭文件是stdlib.h,其函數聲明如下:
void* malloc(size_t size);
其中參數size_t size表示動態內存分配空間的大小,以字節為單位。
size_t 是typedef重定義的類型,重定義這樣數據類型的作用就是讓使用者一目了然,指示使用者這個參數表示一個長度,在 size后加上t,表示是整型相關數據類型的,以后看到xxx_t的類型,通常都是整型相關數據類型重定義。
在這里malloc()函數的返回值是一個指針,或者說是分配后內存空間的首地址
如果malloc()函數申請空間成功則返回一段內存空間的首地址,失敗則返回NULL
2、int *p;
p = malloc(sizeof(int));
在這里是不能這樣寫的,會出現錯誤:從類型 'void*' 到類型‘int’的轉換無效,應該改為:
p =(int *) malloc(sizeof(int));
3、在使用malloc()函數申請的空間之前,最好用memset()函數把這段內存空間清理一下,因為用malloc()函數申請的空間僅僅保 證的是內存空間的大小,並不保證內存空間是否有數據垃圾
4、當不在使用malloc()函數申請的空間之后,應該使用如下函數釋放掉這個內存空間:
void free(void *ptr);
其中void *ptr是malloc()函數的返回值,也就是內存空間的首地址
如果只知道使用,而不知道釋放,則在7天*24小時運行的嵌入式產品中,很容易會出現內存泄漏,最終導致系統癱瘓
5、malloc()函數動態分配空間編程:
/***************************************
malloc()函數動態分配空間編程:
(1)定義一個char*型指針變量p
(2)為p分配10個字節的內存空間
(3)復制"come on" 字符串到p指向的內存空間
(4)將p指針指向的內存空間再擴大20個字節
(5)將",baby!"字符復制在p指向空間字符串的后面
(6)釋放p指向的空間
****************************************/
#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
int main()
{
char *p;
p = (char *)malloc(10*sizeof(char));
memset(p,0,10*sizeof(char));
strcpy(p,"come on");
cout << "p: " << p << endl;
p =(char *)realloc(p,20*sizeof(char));
cout << "p: " << sizeof(p) << endl;
strcat(p,",baby!");
cout << "p: " << p << endl;
free(p);
return 0;
}
輸出:
p: come on
p: 4
p: come on,baby!
1 malloc后的內存除了等到free來釋放,還可以等到程序運行結束時自動釋放
2 程序運行過程中,如果一直malloc內存而不釋放會導致這部分內存不能被再次使用,即內存泄露。這樣以來,應用程序會逐漸用光所有可用的內存,最終導致應用程序因內存不足而崩潰停止。
3 所以一個好的習慣是,malloc后一定要記得free之。