C语言内存管理的基本操作
(摘选自《Linux C从入门到精通》)
分配内存
计算机的内存空间都是通过指针访问的,而指针对于对于正确地分配动态内存空间来说又是十分重要的。下面为一些动态内存分配操作函数的介绍。
1.malloc()函数
void*malloc(unsigned int size);
该函数的功能是分配长度为size字节的内存块。
如果分配成功,则返回指向被分配内存的指针;否则返回空指针NULL。需要注意的是,当内存不再使用时,需要使用free()函数释放内存块。例如,使用malloc()函数获得一块内存空间,内存空间的大小与返回的指针类型需由程序员根据需要自行规定,代码如下:
void*malloc(unsigned int size);
void main()
{
long*buffer;
buffer = (long*)malloc(400); //获得一块长整型数组空间
free(buffer); //释放内存空间
}
2.calloc()函数
函数原型:
void *calloc(unsigned n,unsigned size);
该函数的功能是在内存的动态区存储中分配 n 个长度为size的内存块。
如果分配成功,则返回指向被分配内存的指针;否则返回空指针NULL。同样,在内存不再使用时,要用free()函数释放内存块。
同时,用calloc() 函数可以为一维数组开辟动态存储空间,n为数组元素的个数,每个元素长度为size。
例如,使用calloc() 函数获得一块长整型数组空间,代码如下:
void main()
{
long *buffer;
buffer =(long *)calloc(20,sizeof(long)); //获得一块长整型数组空间
free(buffer); //释放内存空间
}
3.realloc()函数
函数原型为:
void *realloc(void *mem_address,unsigned int newsize);
该函数的功能是调整 mem_address 所指向区域内存的大小为 newsize 长度。
如果重新分配内存成功,则返回指向被分配内存的指针;否则返回空指针NULL。同样,当内存不再使用时,应用 free() 函数将内存空间释放掉。
当参数mem_address 指向 NULL时,即调整空指针所指向的内存区域的大小为 newsize 长度,此时realloc() 函数的功能与malloc() 函数相同,若参数 newsize 为0,即要调整成长度为0时,realloc() 函数所实现的功能就相当于 free() 函数, 释放掉该内存块。。
示例代码:
#include <stdlib.h>
#include <stdio.h>
int main()
{
char *p;
p = (char *)malloc(100); //为指针P开辟一个内存空间
if(p) //判断内存成功分配与否
{
printf("Memory Allocated at:%x",p);
}
else
{
printf("Not Enough Memory!\n");
}
getchar(); //调整P内存空间从100字节到256字节
p = (char *)realloc(p,256);
if(p) //判断内存成功分配与否
{
printf("Memory Reallocated at:%x",p);
}
else
{
printf("Not Enough Memory!\n");
}
free(p); //释放指针p指向的内存空间
getchar();
return 0;
}
运行效果图:
4.memset()函数
函数原型为:
void *memset(void *s,char ch,unsigned n);
该函数的功能是设置s中的所有字节为 ch,s的数组大小为n;
示例代码:
```c
#include <stdio.h>
#include <string.h>
int main()
{
char s[] = "HelloWorld\n"; //定义一个字符数组s
printf("s before memset: %s\n",s); //输出字符数组中的内容
memset(s,'*',strlen(s)-1); //设置S数组中的字符串内容为 “*”
printf("s after memset: %s\n",s); //输出字符数组中的内容
return 0;
}
``运行效果图:
5.释放内存
函数原型为:
void free(void *memblobk);