C语言动态内存

malloc数组

  • 原型:void *malloc(size_t size)
    • size:请求内存的总字节数
    • 返回值:内存地址 NULL
#include<stdio.h>
#include<stdlib.h>
#define LEN 3

int main(void)
{
    //定义指向堆空间指针
    int* p = (int*)malloc(LEN*sizeof(int));
    if(NULL==p)
    {
        printf("内存申请失败\n");
        return -1;
    }
    //类数组方式赋值
    for(int i=0;i<LEN;i++)
    {
        printf("输入:");
        scanf("%d",p+i);
    }
    //遍历
    for(int i=0;i<LEN;i++)
    {
        printf("%d\t",*(p+i));
    }
    //换行
    printf("\n");
    //释放内存
    if(NULL!=p)
    {
        free(p);
        p = NULL;
    }
    return 0;
}

总结指针

  • malloc申请的内存在申请已后如同数组同样暂时性不可变,同时申请的内存是连续内存因此能够如数组同样经过下标访问到元素,同时用malloc申请的内存空间系统不会进行初始化操做,内部处于随机状态

calloccode

  • 原型:void *calloc(size_t nitems, size_t size)
    • nitems:个数
    • size:类型字节
    • 返回值:内存地址 NULL
#include<stdio.h>
#include<stdlib.h>

int main(void)
{
    printf("须要多个个?:");
    int n;//个数
    scanf("%d",&n);//用户输入个数
    int* p = (int*)calloc(n,sizeof(int));//申请对应个数的内存
    if(NULL==p)//申请失败的问题
    {
        printf("内存申请失败\n");
        return -1;
    }
    for(int i=0;i<n;i++)//循环输入
    {
        printf("输入:");
        scanf("%d",p+i);//相似数组
    }

    for(int i=0;i<n;i++)//循环输出
    {
        printf("%d\t",*(p+i));
    }
    printf("\n");
    if(NULL!=p)//释放空间
    {
        free(p);
        p=NULL;
    }
    return 0;
}

总结内存

calloc

  • calloc具备申请空间后自动初始化的能力,官方描述中也是如此,malloc是申请空间后不初始化,而传参数方面,二者几乎同样,malloc参数总字节数,而calloc则分开成个数单个字节
  • 在元素访问上看与数组无异

realloc原型

  • 原型:void *realloc(void *ptr, size_t size)
    • ptr:须要从新分配内存空间的目标地址
    • size:从新分配后的总大小
    • 返回值:内存地址 NULL
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main(void)
{
    char* str=(char*)calloc(8,sizeof(char));//申请堆区内存
    strcpy(str,"abcdefg");
    printf("从新分配以前第四位字符:%c\n",*(str+3));
    printf("从新分配以前:%d个占位\n",(int)strlen(str));
     str = (char*)realloc(str,((int)sizeof(str)+2)*sizeof(char));
     printf("从新分配以后:%d个占位\n",(int)strlen(str));
     if(NULL!=str)
     {
         free(str);
         str = NULL;
     }
    return 0;
}

out

总结string

  • realloc只能从新分配从malloc calloc申请到的内存空间,若是分配其它空间绝逼报错不解释,最易出错的在于malloc是直接申请一块内存,只须要传入你的需求量,而且不会帮你初始化,而calloc一样是直接申请一块内存但会初始化,传值是个数和单个类型的字节,而realloc是起到一个从新分配的做用,它的参数须要的是一个目标指针,和分配后这个目标指针的总大小,就比如原先的内存占用是2个字节的,如今须要+3个字节,哪么你的总需求量则是5个字节占位,而不是3
相关文章
相关标签/搜索