| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2172 人关注过本帖
标题:realloc 和 malloc 函数分配内存
只看楼主 加入收藏
yuantkong
Rank: 2
等 级:论坛游民
威 望:3
帖 子:82
专家分:86
注 册:2016-5-17
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:6 
realloc 和 malloc 函数分配内存

理论上如果 realloc 分配的内存比 malloc原本分配的内存大就会替代.

VS编译器 但是测试的程序 ,

p=(int*)malloc(sizeof(int));  //分配 1个int 内存
p=(int*)realloc(p,3*sizeof(int); //分配3个int 内存

只要 realloc 里分配的int 内存个数不超过3个, 它的地址就给 malloc 分配一个int 内存的地址是一样的

书上是显示不一样. 是因为编译器原因还是什么?
搜索更多相关主题的帖子: 编译器 
2016-06-04 10:19
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
什么书?
标准规定 malloc(n) 分配不小于n个字节的连续内存
2016-06-04 10:32
playmyself
Rank: 5Rank: 5
来 自:第3系4级宇宙空间
等 级:职业侠客
帖 子:76
专家分:399
注 册:2009-7-8
收藏
得分:0 
编译器的优化,我用gcc就不是。

无聊创造奇迹。
2016-06-04 18:49
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:4 
可能是:
p=(int*)realloc(p,m*sizeof(int));
realloc当能找到m*sizeof(int)大小连续的可用内存空间时,返回这块内存空间的首址。
如果能在之前 p=(int*)malloc(n*sizeof(int)) 起的连续空间内找到满足p=(int*)realloc(p,m*sizeof(int))的需要,理论上p应该是可以不变,并且少了移动数据和释放之前分配的内存空间等操作过程,执行效率会更高,但实际情况是不是这样?


[此贴子已经被作者于2016-6-5 08:25编辑过]

2016-06-05 08:21
yuantkong
Rank: 2
等 级:论坛游民
威 望:3
帖 子:82
专家分:86
注 册:2016-5-17
收藏
得分:0 
回复 4楼 吹水佬

不确定。

试着realloc 的时候 只要m <=3 ,它返回的首地址就会跟 malloc 分配一个int 内存的首地址一致


#include "stdafx.h"
#include "stdlib.h"

int main()
{
    int *p = NULL;                        //初始化

    p = (int *)malloc(sizeof(int)); // 用malloc 给p 分配 内存
   
    if (NULL == p)
    {
        printf("error.\n");
        return -1;
    }
    *p =4;
    printf("p=%p\n", p);
    printf("*p=%d\n", *p);

    p = (int *)realloc(p, sizeof(int));  //用realloc 给 p 分配内存
   
    if (NULL == p)
    {
        printf("error.\n");
        return -1;
    }
    printf("p=%p\n", p);
    printf("*p=%d\n", *p);
   
    p = (int *)realloc(p, 3 * sizeof(int));  //为p分配 3 个 int 内存空间
   
    if (NULL == p)
    {
        printf("error.\n");
        return -1;
    }
    printf("p=%p\n", p);
    printf("*p=%d\n", *p);

    realloc(p, 0);
    p = NULL;
   

    printf("sizeof(int)=%d \n", sizeof(int));
    printf("3*sizeof(int)=%d \n", 3* sizeof(int));
    return 0;
}
2016-06-06 22:10
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:8 
实际情况复杂,要看realloc的内幕。
    p = (int *)malloc(sizeof(int));      // 用malloc 给p 分配 内存
    p = (int *)realloc(p, sizeof(int));  //用realloc 给 p 分配内存

    p = (int *)malloc(sizeof(int));      // 用malloc 给p 分配 内存
    int a[1];
    p = (int *)realloc(p, sizeof(int));  //用realloc 给 p 分配内存
结果应该也不同
2016-06-06 23:10
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:8 
看两篇文章,大致应该知道realloc是调用malloc的,所不同的是当realloc发现指针p有指向,就做调整大小的工作,如果连续的空间不够,realloc会转移原指向的数据到一个足够大的新空间,这时数据不变,p的指向已经变了。所以要弄清楚申请的堆内存首地址是无意义的。

http://blog.  malloc与realloc的区别

http://blog.   C语言的内存管理

能编个毛线衣吗?
2016-06-07 08:30
快速回复:realloc 和 malloc 函数分配内存
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016946 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved