观察内存分配结果(利用Linux的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 动态分配内存呢?比如;
它的意思是:请求系统分配 4 字节的内存空间,并返回第一字节的地址,然后赋给指针变量 p。当用 malloc 分配动态内存之后,上面这个指针变量 p 就被初始化了需要注意的是,函数 malloc 的返回值类型为 void* 型,而指针变量 p 的类型是 int* 型,即两个类型不一样,那么可以相互赋值吗?
所以“int*p=(int*)malloc(4);”就可以写成“int*p=malloc(4);”。此句执行完之后指针变量 p 就指向动态分配内存的首地址了。
观察Linux的malloc函数动态申请内存空间的内存分配结果可以通过一些工具或方法进行。以下是几种常用的方法:
valgrind --leak-check=full ./your_program
gdb your_program
...
(gdb) run
...
(gdb) info malloc
其中,info malloc命令可以显示程序当前申请的内存块的详细信息。
例如,以下是一个使用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函数动态申请一段内存空间的内存分配结果,具体使用取决于个人的习惯和需求。