• c语言训练7


    交换两个值的非正常方法

    #include
    void nowMethod();
    int main(){
        nowMethod();
        return;
    }
    void nowMethod(){
        int a=2,b=5;
        a+=b;
        b=a-b;
        a-=b;
        printf("a=%d,b=%d",a,b);
    }

    malloc和free函数

    malloc 开辟堆区的内存空间

    这个函数申请一块连续的可用的空间,并返回这块空间的指针

    如果开辟成功,就会返回开辟好的内存空间的指针

    如果开辟失败,就会返回一个空指针

    因为返回值是void*,所以malloc并不知道开辟空间的类型,这个由使用者决定
    如果参数 size 为0,malloc的行为是标准是未定义的,取决于编译器。
    #include
    #include
    #include
    #include
    int main()
    {
        //向内存申请十个整型的空间
        int *p=(int*)malloc(10 * sizeof(int));
        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\n", *(p + i));
            }
        }
        return 0;
    }

    free 释放申请的空间

    当动态申请的空间不在再使用的时候,就应该通过free函数来还给操作系统
    1如果参数 ptr 指向的空间不是动态开辟的,那 free 函数的行为是未定义的。
    2如果参数 ptr 是 NULL 指针,则函数什么事都不做。
     

    #include
    #include
    #include
    #include
    int main()
    {
        //向内存申请十个整型的空间
        int *p = (int*)malloc(10 * sizeof(int));
        free(p);//释放动态分配的空间
        p=NULL;//这一步是必要的,断开这个p和这个内存空间的练习,防止出错
        return 0;
    }

    realloc

    1 ptr 是要调整的内存地址

    2 size 调整之后新大小

    3 返回值为调整之后的内存起始位置。

    4 这个函数调整原内存空间大小的基础上还会将原来内存中的数据移动到 新 的空间。

     #include
    #include
    #include
    #include
    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来调整动态开辟的内存
            int* p2 =(int*) realloc(p, 40);
            for (i = 5; i < 10; i++)
            {
                *(p2 + i) = i;
            }
            for (i = 0; i < 10; i++)
            {
                printf("%d ", * (p2 + i));
            }
        }
        free(p);//释放动态分配的空间
        p = NULL;
            return 0;
    }

    使用注意点

    1当后面的内存足够大,则直接在后面追加,后返回p

    2当后面的内存不够大,则realloc会重新找一块新的内存区域,开辟一块满足需求的空间,并且把原来内存中的数据拷贝过来,释放旧的内存空间,最后返回新开辟的内存空间地址

    3需要一个新的变量来接受realloc的返回值
    #include
    #include
    #include
    #include
    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来调整动态开辟的内存
            int* p2 =(int*) realloc(p, 40);
            if (p2!=NULL)
            {
                p = p2;
                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;
    }

    学习参考

    C语言动态内存管理详解-pudn.com

  • 相关阅读:
    JS-运算符
    Linux安装DMETL5与卸载
    Web前端开发技术课程大作业:简单的网页制作期末作业——狐妖小红娘(6页)
    uniapp打包安卓apk增加推送UniPush工具hbuilder
    Oracle(14) Managing Password Security and Resources
    2022下半年教资已经开始注册,1分钟看懂证件照审核要求
    Pyglet综合应用|推箱子游戏地图编辑器之图片跟随鼠标
    ocx 调用dll必须要将dll路径加到Path中 尽量用静态编译 用共享编译时需要把dll复制到system32下否则注册提示缺少dll
    Java多线程(5):CAS
    12. 自动化项目实战
  • 原文地址:https://blog.csdn.net/m0_55772907/article/details/127663596