刚刚学到malloc,然后试着写了串代码看看重复对p用malloc,malloc的地址和程序运行的结果是什么。
#include<stdio.h>
#include<stdlib.h>
int main()
{
int* p=0;
p = (int*)malloc(1024 * 1024 * 100);
printf("%p\n", p);
while (p != NULL)
{
p = (int*)malloc(1024 * 1024 * 100);
printf("%p\n", p);
}
printf("%p\n", p);
}
p的地址一直增大直到超出分配空间会返回0这我知道。
疑惑的是:p的地址一直增大是不是因为重复做malloc之前没有free?
不理解的是:每行的p的地址都是首地址吗(我想毕竟它重新分配了,所以首地址也跟着重新变换了?)?如果是的话那之前分配过的没有free的空间去哪了?p还指向那些地方吗?
每行的p的地址都是首地址,每次malloc后,由系统重新分配内存,所以p也会随着改变,直到没有内存可以分配(程序会崩溃)。
没有free的空间还保留在程序中,但是因为已经让p指向了新申请的内存,所以先申请的内存已经丢失,无法再使用,这就会造成内存泄露。之前申请的那些内存空间,只会在程序结束的时候,由系统回收。
malloc分配的内存操作系统会认为被你这个程序占用。可是这个内存的地址由于你重复申请而丢弃了,因为p已经指向了新申请的地址,原地址没有变量记录,就再也找不回来了,只有程序运行结束后,操作系统自动回收后才能重新给其它程序分配
p是否一直增大,这个是由操作系统的内存管理来控制的,操作系统总是寻找最合适的空间段分配给你。