更灵活的内存管理方式
malloc:申请动态内存空间
free:释放动态内存空间
calloc:申请并初始化一系列动态内存空间
realloc:重新分配内存空间
malloc:void *malloc(size_t,size);
malloc:向系统申请分配size个字节的内存空间,并返回一个指向该内存空间的指针
若函数调用成功,返回一个指向内存空间的指针,由于返回类型是void指针,所以他可以被转换为任意类型的指针;若函数调用失败,返回值是NULL。另外,若size设置为0,返回值也可以是NULL,但并不意味着调用函数失败。
int *ptr;
ptr = (int *)malloc(sizeof(int));
这就是向CPU申请int类型的字节空间
free:void free(void *ptr);
free函数释放ptr参数所指向的内存空间,给内存空间必须是由malloc,calloc,realloc函数申请的。否则,该函数将导致未定义行为。如果ptr参数是NULL,则不执行任何操作。注意:该函数并不会修改ptr参数的值,所以调用后它仍然指向原来的地方(边为非法空间)
内存泄漏的两种情况:隐式内存泄漏(即用完内存空间没有及时使用free函数释放),2、丢失内存地址
malloc函数还可以申请一块任意尺寸的内存空间
#include<stdio.h>
#include<stdlib.h>
int main()
{
int *ptr = NULL;
int num,i;
printf("please input the space you want:");
scanf("%d",&num);
ptr = (int *)malloc(num * sizeof(int));//申请用户输入的内存空间
printf("please input number:");
for(i=0;i<num;i++)
{
scanf("%d",&ptr[i]);
}
printf("the numbers are:");
for(i=0;i<num;i++)
{
printf("%d ",ptr[i]);
}
printf("\n");
free(ptr);
return 0;
}
初始化内存空间:memset(使用一个常量字节填充内存空间)
memset(ptr,0,N*sizeof(int));
memcpy(拷贝内存空间)
memmove(拷贝内存空间)
memcmp(比较内存空间)
memchr(在内存空间中搜索一个字符)
calloc:void *calloc(size_t nmeb,size_t size);
calloc函数在内存中动态申请nmeb个长度为size的连续内存空间(即申请的总空间尺寸为nmeb *size),这些内存空间全部被初始化为0。
calloc函数与malloc函数的一个重要区别为:
calloc函数在申请完内存空间后,自动初始化该内存空间为0;、
malloc函数不进行初始化操作,里面的数据是随机的。
int *ptr = (int *)calloc(8,sizeof(int))
int *ptr = (int *)malloc(8 * sizeof(int));
memset(ptr,0,8 * sizeof(int));
上述两者是等价的。
扩展操作:
realoc函数:void *realloc(void *ptr,size_t size);第二个参数是指针指向的另一个尺寸(分配的新的地址)
以下几点需要注意:realloc函数修改ptr指向的内存空间大小为size字节
1、如果新分配的内存空间比原来的大,则旧内存块的数据不会发生改变;如果新的内存空间大小小于旧的内存空间大小,可能会导致数据丢失,慎用!!!!
2、该函数将移动内存空间的数据并返回新的指针;
3、如果ptr参数为NULL,那么调用该函数就相当于调用malloc(size);
4、如果size为0,并且ptr参数不为NULL,那么调用该函数就相当于调用free(ptr);
5、除非ptr参数为NULL,否则ptr的值必须由先前调用malloc,calloc,realloc函数返回。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(void)
{
int num;
int count = 0;
int *ptr = NULL; /*这里必须初始化为NULL*/
do
{
printf("please input number (until -1):");
scanf("%d",&num);
count++;
ptr = (int *)realloc(ptr,count * sizeof(int));
if(ptr == NULL)
{
exit(1);
}
ptr[count-1] = num;
}while(num != -1);
printf("numbers are:");
for(int i=0;i<count;i++)
{
printf("%d ",ptr[i]);
}
return 0;
}
代码功能:让用户自行输入数据,每输入一个数据,内存空间加一。