• 我理解的malloc()和free()。


        关于malloc和free这两个函数,malloc的使用方法演示样例:int *p=(int *)malloc(2*sizeof(int)); 它表示在堆中开辟一块大小为2*sizeof(int)的一块内存空间,p指向这块内存空间的起始地址。malloc前面的(int*)表示这块空间用来存储int型数组。开辟了这块空间后。能够改动这个空间中的值。比如为*p,*(p+1)做赋值操作,假设再次使用malloc函数,比如再写一个 int *q=(int *)malloc(2*sizeof(int)); 此时开辟的以q为起始地址长度为2*sizeof(int)的空间是不会覆盖p所指向的空间的。

    可是。假设在int *q=(int *)malloc(2*sizeof(int));之前写一个free(p),那么,q所指向的空间则有可能覆盖p指向的空间。所谓的free(p)操作,事实上是改动p所指向的空间的标记值。让其能够被覆盖。

    虽然运行了free(p),p仍就指向曾经的起始地址,依然能够对*p,*(p+1)赋值,而且可訪问他们(比如输出)。

    代码例如以下:

    int main(){
        int *p=(int *)malloc(2*sizeof(int));
        free(p);
        *p=1;
        *(p+1)=2;
        cout<<p<<endl<<(p+1);
        cout<<endl;
        cout<<*p<<endl<<*(p+1);
    
        int *q=(int *)malloc(2*sizeof(int));
        cout<<endl<<q<<endl<<(q+1);
        cout<<endl<<*q<<endl<<*(q+1);
        return 1;
    }

    执行结果:

    补充:

    int *p=(int *)malloc(2*sizeof(int)); 若要释放这段空间,必须free(p),仅仅是单单想释放部分空间,比如free(p+1)是不同意的。

    如有错误,请大家指正。

  • 相关阅读:
    10分钟学会理解和解决MySQL乱码问题
    C# 序列类为 xml 可以使用的特性大全
    C# GUID ToString
    C# GUID ToString
    C# AddRange 添加位置
    C# AddRange 添加位置
    VisualStudio 使用多个环境进行调试
    VisualStudio 使用多个环境进行调试
    C# 使用外部别名
    C# 使用外部别名
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/6835594.html
Copyright © 2020-2023  润新知