观察内存分配结果(利用Linux的malloc函数)

观察内存分配结果(利用Linux的malloc函数动态申请一段内存空间)

img

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7771744
  • 这篇博客你也可以参考下:使用malloc函数创建动态数组
  • 同时,你还可以查看手册:分配内存-malloc 中的内容
  • 除此之外, 这篇博客: 动态内存分配中的 malloc函数的使用 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

         那么动态内存是怎么造出来的?在讲如何动态地把一个数组造出来之前,我们必须要先介绍 malloc 函数的使用。
        malloc 是一个系统函数,它是 memory allocate 的缩写。其中memory是“内存”的意思,allocate是“分配”的意思。顾名思义 malloc 函数的功能就是“分配内存”。要调用它必须要包含头文件<stdlib.h>。它的原型为:

    # include <stdlib.h>
    void *malloc(unsigned long size);

        malloc 函数只有一个形参,并且是整型。该函数的功能是在内存的动态存储空间即堆中分配一个长度为size的连续空间。函数的返回值是一个指向所分配内存空间起始地址的指针,类型为 void*型。

        简单的理解,malloc 函数的返回值是一个地址,这个地址就是动态分配的内存空间的起始地址。如果此函数未能成功地执行,如内存空间不足,则返回空指针 NULL。
         “int i=5;”表示分配了 4 字节的“静态内存”。这里需要强调的是:“静态内存”和“静态变量”虽然都有“静态”两个字,但是它们没有任何关系。不要以为“静态”变量的内存就是“静态内存”。静态变量的关键字是 static,它与全局变量一样,都是在“静态存储区”中分配的。这块内存在程序编译的时候就已经分配好了,而且在程序的整个运行期间都存在;而静态内存是在栈中分配的,比如局部变量。
       那么,如何判断一个内存是静态内存还是动态内存呢?凡是动态分配的内存都有一个标志:都是用一个系统的动态分配函数来实现的,如 malloc 或 calloc。
         calloc 和 malloc 的功能很相似,我们一般都用 malloc。calloc 用得很少,这里不做讲解,有兴趣的话可自行查阅。如何用 malloc 动态分配内存呢?比如; 

    1. int *p = (int *)malloc(4)

        它的意思是:请求系统分配 4 字节的内存空间,并返回第一字节的地址,然后赋给指针变量 p。当用 malloc 分配动态内存之后,上面这个指针变量 p 就被初始化了需要注意的是,函数 malloc 的返回值类型为 void* 型,而指针变量 p 的类型是 int* 型,即两个类型不一样,那么可以相互赋值吗?
         所以“int*p=(int*)malloc(4);”就可以写成“int*p=malloc(4);”。此句执行完之后指针变量 p 就指向动态分配内存的首地址了。

  • 您还可以看一下 王桂林老师的C语言:从放弃到入门课程中的 11-3堆内存的申请malloc alloc小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    观察Linux的malloc函数动态申请内存空间的内存分配结果可以通过一些工具或方法进行。以下是几种常用的方法:

    1. valgrind工具: 使用valgrind工具可以监控程序的内存泄漏等问题,其中包含了内存申请的分配情况。安装之后,在终端中输入以下命令来进行检测:
    valgrind --leak-check=full ./your_program
    
    1. gdb调试器: 使用gdb调试器也可以观察内存分配情况。使用以下命令来进行检测:
    gdb your_program
    ...
    (gdb) run
    ...
    (gdb) info malloc
    

    其中,info malloc命令可以显示程序当前申请的内存块的详细信息。

    1. 代码中手动监测: 在代码中手动监测也是一种常用的方法,可以使用printf语句来输出当前申请的内存块的地址信息等。

    例如,以下是一个使用malloc申请内存的例程,在代码中加入了一些printf语句来输出内存申请的情况:

    #include<stdio.h>
    #include<stdlib.h>
    
    int main()
    {
        int *a;
        int n;
        //输入你要存放多少个元素 
        scanf("%d",&n); 
        //申请足够存放n个元素的内存单元 
        a=(int *)malloc(n*sizeof(int));
        for(int i=0;i<n;i++)
        {
            scanf("%d",a+i);
            printf("第%d个元素的地址:%p\n", i+1, a+i);
        } 
        free(a);
        return 0;
    }
    

    以上三种方法都可以用来观察Linux的malloc函数动态申请一段内存空间的内存分配结果,具体使用取决于个人的习惯和需求。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^