更灵活的内存管理方式
malloc
-申请动态内存空间
函数原型:
-void *malloc(size_t size);
malloc函数向系统申请分配size个字节的内存空间,并返回一个指向这块空间的指针。
如果函数调用成功,返回一个指向申请的内存空间的指针,由于返回类型是void指针(void*),所以它可以被转换成任何类型的数据;如果函数调用失败,返回值是NULL。另外,如果size参数设置为0,返回值也可能是NULL,但这并不意味着函数调用失败。
#include <stdio.h>
int main()
{
int *ptr;
ptr = (int *)malloc(sizeof(int));
if (ptr == NULL)
{
printf("分配内存失败!\n");
exit(1);
}
printf("请输入一个整数:");
scanf("%d", ptr);
printf("你输入的整数是:%d\n",*ptr);
return 0;
}
free
-释放动态内存空间
函数原型:
-void free(void *ptr);
free函数释放Ptr参数指向的内存空间。该内存空间必须是由malloc,calloc或realloc函数申请的。否则,该函数将导致未定义行为。如果ptr参数是NULL,则不执行任何操作。注意:该函数并不会修改ptr参数的值,所以调用后它仍然指向原来的地方(变为非法空间)。
#include <stdio.h>
int main()
{
int *ptr;
ptr = (int *)malloc(sizeof(int));
if (ptr == NULL)
{
printf("分配内存失败!\n");
exit(1);
}
printf("请输入一个整数:");
scanf("%d", ptr);
printf("你输入的整数是:%d\n",*ptr);
free(ptr);
printf("你输入的整数是:%d\n",*ptr);
return 0;
}
calloc
-申请并初始化一系列的内存空间
realloc
-重新分配内存空间
内存泄漏
如果申请的动态内存没有及时释放会怎么样
总结一下,导致内存泄漏主要原因有两种情况:
-隐式内存泄漏(即用完内存块没有及时使用free函数释放)
-丢失内存块地址
malloc
malloc还可以申请一块任意尺寸的内存空间
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int *ptr=NULL;
int num, i;
printf("请输入待录入整数的个数:");
scanf("%d", &num);
ptr = (int*)malloc(num*sizeof(int));
for (i=0;i<num; i++)
{
printf("请录入第%d个整数:",i+1);
scanf("%d",&ptr[i]);
}
printf("你录入的整数是:\n");
for (i=0;i<num;i++)
{
printf("%d\n",ptr[i]);
}
free(ptr);
return 0;
}
初始化内存空间
以men开头的函数被编入字符串标准库,函数的声明包含在string.h这个头文件中:
-memset -- 使用一个常量字节填充内存空间
-memcpy -- 拷贝内存空间
-memmove --
-memcmp -- 比较内存空间
- memchr -- 在内存空间中搜索一个字符
calloc
函数原型:
-void *calloc(size_t nmemb, size_t size);
calloc函数在内存中动态的申请nmemb个长度为size的连续内存空间(即申请的总内存空间尺寸为nmemb *size),这些内存空间全部被初始化为0。
calloc函数与malloc函数的一个重要区别是:
-calloc函数在申请完内存后,自动初始化该内存空间为零
-malloc函数不进行初始化操作,里边数据是随机的
下边两种写法是等价的:
//calloc()分配内存空间并初始化
int *ptr = (int *)calloc(8,sizeof(int));
//malloc() 分配内存空间并用memset()初始化
int *ptr = (int *)malloc(8*sizeof(int));
memset(ptr, 0,8*sizeof(int));
realloc
函数原型:
-void *realloc(void *ptr, size_t size);
以下几点时需要注意的:
-realloc函数修改ptr指向的内存空间大小为size字节
-如果新分配的内存空间比原来的大,则就内存块的数据不会发生改变;如果新的内存空间大小小于旧的内存空间,可能会导致数据丢失,慎用!
-该函数将移动内存空间的数据并返回新的指针
-如果ptr参数为NULL,那么调用该函数就相当于调用malloc(size)
-如果size参数为0,并且ptr参数不为NULL,那么调用该函数就相当于调用free(ptr)
-除非ptr参数为NULL,否则ptr的值必须由先前调用malloc,calloc或realloc函数返回