动态内存管理

更灵活的内存管理方式

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;
}

代码功能:让用户自行输入数据,每输入一个数据,内存空间加一。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值