malloc()与free()详解
##malloc()
void *malloc(size_t size); 表示该函数分配了size个字节,并且返回这块内存的指针,若分配内存失败则返回空指针(NULL)。
tips:
1. malloc()是在特定的内存区划出一块采用参数指定的大小内存块,并将这块内存块的起始地址返回;
2. malloc()分配内存返回的内存块的起始地址需要指针来接收,否则会出现内存泄漏;
3. malloc()分配的内存空间,其逻辑地址是连续的,但是物理地址不一定连续。即虚拟地址空间是连续的,物理内存空间则不一定。
##free()
void free(void *ptr);表示释放ptr所指的内存,并且将其返回给堆空间,成为在下次分配内存的可用内存。
tips:
1. free()函数只能用于之前由动态地址分配的函数;
2. free()函数是通过调用操作系统函数,将原先分配的内存区域进行释放;
3. free()通过指针找到相应的内存分配表进行内存释放;
4. 释放内存不是丢掉指针,而是将指针所指定的内存空间进行释放,否则会造成内存泄露。
代码示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 10
int g_sGrade[N] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int main(){
int *p = NULL;
int i = 0;
double Sum = 0.0;
p = (int*)malloc(sizeof(int) * N);
if (p = NULL){
exit(0);
}
p = g_sGrade;
// memcpy(p, g_sGrade, sizeof(int) * N);
for (i = 0; i < N; i++){
Sum = Sum + *(p + i);
}
printf("the average is %lf\r\n ", Sum / N);
free(p);
p = NULL;
return 0;
}
需要注意的一些地方:
1 .申请了内存空间,必须检查内存是否分配成功;
2. 不再使用申请的内存时,必须释放;释放后应该把指向这块内存的指针指向NULL,防止程序后面不小心使用;
3. malloc()和free()函数配对,如果申请后不释放就是内存泄露;
4. 释放只能一次(释放空指针例外)。