内存的分配

内存的动态分配

需要使用#include<stdlib.h>

  • malloc-申请动态空间
  • 函数原型:voidmalloc(size_t,size);*
  • 向系统中申请分配size个字节的内存空间,并返回一个指向这块空间的指针。由于返回类型为void,可以转换为任何类型,函数调用失败会返回NULL,如果size参数设为0,返回值也可能为NULL。
#include <stdio.h>
#include <stdlib.h>  //调用malloc函数所需的头文件
int main(){
    int *prt,i,num;
    printf("how many number do you want?\n");
    scanf("%d",&num);
    prt=(void*)malloc(num*sizeof(int));//申请分配的内存大小
    printf("please put in some number:\n");
    for(i=0;i < num;i++){
        scanf("%d",&prt[i]);
    }
    printf("you number is:\n");
    for(i=0;i<num;i++){
        printf("%d",*(prt+i));
    }

[^1]:不同机器对于各类型大小定义不同,因此最好使用sizeof()函数求类型大小

free-释放参数指向的内存空间
函数原型-void free(voidptr)*

该空间必须是由malloc,calloc,或realloc函数申请的,若ptr参数为NULL,则不执行任何操作

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
   int *ptr,i,num;
   scanf("%d",&num);
   ptr=(int*)malloc(num* sizeof(int));
   printf("put in %d numbers",num);
   scanf("%d",ptr);
   free(*ptr);
   printf("%d",*ptr);
}          

该函数不会修改prt参数的值,所以调用后仍然指向原方向,但是变成非法空间。

内存溢出
如果申请内存的时候在循环中,就会造成反复申请的情况,以至于内存大量损耗得不到释放,因此要格外注意。

calloc函数-向系统申请分配
可以使malloc函数少一步初始化为0的过程

realloc-修改ptr指向的内存
函数原型-voidrealloc(voidptr)realloc((voidptr)size_t,size)*
先判断当前的指针是否有足够的连续空间,扩大ptr指向的地址,并且将ptr返回,如果空间不够,先按照你指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来ptr所指内存区域,同时返回新分配的内存区域的首地址,即重新分配存储器块的地址。(注意:原来指针是自动释放,不需要使用free,但是使用realloc函数改变过的函数结束后,需要用free释放空间)

  int *prt, i, num;
    printf("how many number do you want?\n");
    scanf("%d", &num);
    prt = (void *) malloc(num * sizeof(int));
    printf("please put in some number:\n");
    for (i = 0; i < num; i++) {
        scanf("%d", &prt[i]);

    }
    prt = (void *)realloc(*prt,(num+1)* sizeof(int));
    

⚠️

  • 要确保新分配的内存大于原来的内存,否则可能会导致数据的丢失

    当内存分配成功后,指针会返回一个void,此时可以把它强制转化为其他类型,如果分配不成功。

  • 如果ptr的参数为NULL,那么调用该函数相当于调用malloc(size)

  • 如果ptr的参数为NULL,且size为0,那么调用该函数相当于调用free函数

  • 除非ptr的参数为NULL,否则它必须由先前调用的malloc,calloc,或realloc的返回。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值