33,311
社区成员
发帖
与我相关
我的任务
分享
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
char *str(void)
{
char *p1 = (char *)malloc(100);//堆区
char *p2 = (char *)malloc(100);
printf("p1=%d,p2=%d\n", p1, p2);
free(p1);
free(p2);
return 0;
}
void main(void)
{
char *q=NULL;
q = str();//堆的生长方向:p1到p2地址递减了
}
#include "stdio.h"
#include "malloc.h"
char *str(void)
{
char *p1 = (char *)malloc(100);//堆区
char *p2 = (char *)malloc(100);
printf("p1=0x%x,p2=0x%x\n", p1, p2);
printf("p1=0x%x,p2=0x%x\n", &p1, &p2);
free(p1);
free(p2);
return 0;
}
void main(void)
{
char *q=NULL;
q = str();//堆的生长方向????
}
[/quote]#include "stdio.h"
#include "malloc.h"
char *str(void)
{
char *p1 = (char *)malloc(100);//堆区
char *p2 = (char *)malloc(100);
printf("p1=0x%x,p2=0x%x\n", p1, p2);
printf("p1=0x%x,p2=0x%x\n", &p1, &p2);
free(p1);
free(p2);
return 0;
}
void main(void)
{
char *q=NULL;
q = str();//堆的生长方向????
}
[/quote]
栈的分配没有异议。 我继续给你来解释堆是怎么回事,你的这个结果是可以理解的也是对的。 因为这要从内存分配机制讲。当申请堆的内存时有一个堆管理器回来处理你的内存分配请求,他会查看可用的内存块那个块可以满足你请求的大小。我们可以把堆想成是一些excel表格,它会从中找到一个空闲表格返回给你,也就是你malloc返回的。当你用完了不用了释放了free(),这个表格又变成空闲可用的了。这样的话其他的再申请的时候会优先的把这个空闲的返回。但是如果没有空闲的表格 那么堆管理器会在已用的表格的后面重新分配新表格给你。由此可见堆会在最下面创建新的空间,也就是内存地址最大,返回的地址是向下递增的。
你的这个情况应该是这样,当malloc p1时,堆管理器没有找到空闲的表格所以在最后(地址最大)新建了表格给你,之后在malloc p2之前,有一个之前使用着的表格free()了施放了,空闲了,这个时候你调用了malloc p2,当然会优先返回这个空闲的表格给你,当然这个地址比p1要小。也就是你的情况。当然这个空闲的表格得满足你的条件,即空闲的内存空间得小于或等于你要申请的内存大小。
而你申请的100个字节太小,稍微有表格(内存)被free释放都可以满足你的需求。 为了验证我的说法 你可以把p1 malloc大小不变,p2 malloc申请的大小增大比如到10000,让p1可以优先使用施放的空间,即使有施放的内存因为太小也不符合p2的要求,这样的话堆管理器必然会在最下面申请新的空间给p2,这样p2就会大于p1. 你试试看。这样你就堆有更深入的理解。#include "stdio.h"
#include "malloc.h"
char *str(void)
{
char *p1 = (char *)malloc(100);//堆区
char *p2 = (char *)malloc(100);
printf("p1=0x%x,p2=0x%x\n", p1, p2);
printf("p1=0x%x,p2=0x%x\n", &p1, &p2);
free(p1);
free(p2);
return 0;
}
void main(void)
{
char *q=NULL;
q = str();//堆的生长方向????
}