首页 > 系统相关 >动态内存分配

动态内存分配

时间:2023-08-04 12:45:28浏览次数:33  
标签:malloc NULL int errno 动态内存 printf include 分配

动态内存分配

头文件

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <windows.h>

malloc

int main()
{
    //像内存申请10个整形的空间
    int* p =(int*)malloc(10*sizeof(int));//malloc不初始化为零

    if(p==NULL)
    {
        //打印错误的一个方式
        printf("%s\n",strerror(errno));
    }
    else
    {
        //正常使用空间
        int i = 0;
        for(i=0;i<10;i++)
        {
            *(p+i)=i;
        }
        for(i=0;i<10;i++)
        {
            printf("%d ",*(p+i));
        }
    }
    //当动态申请的空间不在用的时候,就应该还给操作系统
    free(p);
    p = NULL;
    return 0;
} 

calloc

int main()
{
    int* p=(int*)calloc(10,sizeof(int));//calloc初始化为零
    
    if(p==NULL)
    {
        printf("%s\n",strerror(errno));
    }
    else
    {
        int i = 0;
        for(i=0;i<10;i++)
        {
            printf("%d ",*(p+i));
        }
    }
    free(p);
    p = NULL;
    return 0;
} 

realloc

int main()
{
    int* p = (int*)malloc(20);
    if(p==NULL)
    {
        printf("%s\n",strerror(errno));
    }
    else
    {
        int i = 0;
        for(i=0;i<5;i++)
        {
            *(p+i) = i;
        }
    }
    //就是在使用malloc开辟的20个字节空间
    //假设这里,20个字节不能满足我们使用
    //希望有40个字节的空间
    //这里用realloc开辟
    //realloc使用注意事项
    //1.原有空间后有足够的空间,原空间数据不发生变化
    //2.没有足够空间,在堆空间上另找一个合适大小的连续空间来使用。这样函数返回的是一个新地址。
    int* p2 = realloc(p,40);
    int i = 0;
    for(i=5;i<10;i++)
    {
        *(p+i) = i;
    }
    for(i=0;i<10;i++)
    {
        printf("%d ",*(p2+i));
    }
    free(p);
    p = NULL;
    return 0;
}

常见问题

int mian()
{
    //1.对空指针进行解引用操作
    int* p = (int*)malloc(40);
    //万一malloc失败了,p被赋值为NULL
    //*p = 0;//err
    
    int i = 0;
    for(i=0;i<10;i++)
    {
        *(p+i) = i;//err
    }
    free(p); 
    p = NULL;
    
    //2.对动态开辟的内存的越界访问
    int *p = (int*)malloc(5*sizeof(int));
    if(p == NULL)
    {
        return 0;
    }
    else
    {
        int i = 0;
        for(i=0;i<10;i++)
        {
            *(p+i) = i;
        }
    }
    free(p);
    p = NULL;
    
    //3.对动态开辟内存的free
    int a = 10; 
    int* p = &a;
    *p = 20;
    free(p);
    p = NULL;

    int *p = (int*)malloc(40);
    if(p == NULL)
    {
        return 0;
    }
    // //使用
    int *p2 = realloc(p,80);
    if(p2 != NULL)
    {
        p = p2;
    }

    int *p = realloc(NULL,40);//malloc(40)

    //4.使用free释放动态开辟内存的一部分
    int *p = (int*)malloc(40);
    if(p == NULL)
    {
        return 0;
    }
    int i = 0;
    for(i=0;i<10;i++)
    {
        *p++ = i;
    }
    //回收空间
    free(p);
    p = NULL;

    //5.对同一块动态内存的多次释放
    int *p = (int*)malloc(40);
    if(p == NULL)
    {
        return 0;
    }
    //使用
    //释放
    free(p);
    p = NULL;//避免二次free
    //...
    free(p);

    //6.动态开辟内存忘记释放(内存泄漏)
    while(1)
    {
        malloc(1);
    }
    return 0;
}

标签:malloc,NULL,int,errno,动态内存,printf,include,分配
From: https://www.cnblogs.com/bumper/p/17605579.html

相关文章

  • 2023-08-02:给定一棵树,一共有n个点, 每个点上没有值,请把1~n这些数字,不重复的分配到二叉
    2023-08-02:给定一棵树,一共有n个点,每个点上没有值,请把1~n这些数字,不重复的分配到二叉树上,做到:奇数层节点的值总和与偶数层节点的值总和相差不超过1。返回奇数层节点分配值的一个方案。2<=n<=10^5。来自腾讯音乐。答案2023-08-02:大致步骤如下:1.计算出1到n的总和s......
  • 2023-08-02:给定一棵树,一共有n个点, 每个点上没有值,请把1~n这些数字,不重复的分配到二叉
    2023-08-02:给定一棵树,一共有n个点,每个点上没有值,请把1~n这些数字,不重复的分配到二叉树上,做到:奇数层节点的值总和与偶数层节点的值总和相差不超过1。返回奇数层节点分配值的一个方案。2<=n<=10^5。来自腾讯音乐。答案2023-08-02:大致步骤如下:1.计算出1到n的总和sum。2.确......
  • MySQL内存分配详解
    InnoDB存储引擎层基础内存分配如果在编译MySQL的时候不开启FPS的监控,InnoDB对动态内存(heap)的分配和释放使用基础的new、delete、malloc、free等。默认InnoDB对内存的分配和回收会添加FPS的监控模块。InnoDB对动态内存(heap)的分配和回收使用封装后的函数,主要在ut_allocator类中实......
  • 导轨安装一路输入两路输出模拟信号直流隔离分配器变送器
    概述导轨安装DIN12IPOOC系列模拟信号隔离放大器是一种将输入信号隔离放大、转换成按比例输出的直流信号混合集成厚模电路。产品广泛应用在电力、远程监控、仪器仪表、医疗设备、工业自控等需要直流信号隔离测控的行业。此系列产品内部采用了线性光电隔离技术相比电磁隔离具有更好......
  • mysql添加用户并分配权限
    CREATEUSER'username'@'ip'IDENTIFIEDBY'password';GRANTprivilegesONdatabase.tableTO'username'@'ip';其中:username替换为用户名,例如“bigman”ip替换为可访问数据库的ip,例如“127.0.0.1”“192.168.1.1”,使用“%”表示不限制远程连接ippassw......
  • vmware相同镜像分配到同一ip
    昨天看了点ssrf,然后又在写脚本,今天为了方便又开了一个虚拟机,结果突然发现分配到的ip和另一个一样镜像的相同,搁那又加网卡又改设置的,整了半天发现只要改个名字就好了   ......
  • inux 系统中的不同进会程不会分配到相同的虚拟内存地址
    在正常情况下,Linux系统中的不同进程不会分配到相同的虚拟内存地址。这是由于虚拟内存管理机制的设计和实现原则决定的。以下是一些解释:1地址空间隔离:每个进程有自己独立的虚拟地址空间,它们在逻辑上是隔离的。这种隔离性是通过使用独立的页表来实现的。每个进程都有自己的页......
  • [glibc2.23源码]阅读源码&调试,找出free_hook-0x13分配失败的原因
    0x00写在前面2023.7.27早合肥本次阅读源码是本人第一次,算是一个全新的开始。本次看源码是为了调试roarctf的babyheap那道题目,wp写在独奏者2序章那篇的0x04,为了看看为什么free_hook-0x13不能分配堆。0x01阅读前言和别名搜索aliasweak_alias(__malloc_info,malloc_info......
  • SQL 语句获取数据库各表分配空间、占用空间、记录行数
    SELECT    t.NAME AS TableName,    s.Name AS SchemaName,    p.rows AS RowCounts,    SUM(a.total_pages)*8 AS TotalSpaceKB,    CAST(ROUND(((SUM(a.total_pages)*8)/1024.00),2) AS NUMERIC(36,2)) AS TotalSpaceMB,    SUM(a.......
  • ORACLE空间管理实验2:区的管理与分配
    内容基于LMT管理的表空间,字典管理已经不用了。本篇主要验证了这些问题:1.LMT管理的表空间,区的分配有两种方法:系统分配和UNIFORM固定大小-->见实验   2.验证Oracle找寻可用区的方式:从数据文件开头的位图块中获得可用区的信息,DUMP时可见FIRST:3这种,表......