大宇私人领地伊甸园丨宁愿做了后悔,也不要错过后悔[www.mrdayu.com]
注册

24小时联系邮箱:[email protected]

所有文章
大宇私人伊甸园: 首页 > 所有文章 > 编程人生 > C/C++语言 > realloc()函数使用都malloc分配的内存没有任何变动


友情链接:


realloc()函数使用都malloc分配的内存没有任何变动

发布时间:2018/11/22 C/C++语言 标签realloc()阅读:29

源码:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(){
        char *p=(char *)malloc(10);
        if(p){
        //      p="helloworld";
                memcpy(p,"helloword",sizeof("helloword"));
                printf("SIZE=%d\t%s\n",sizeof(p),p);
        }else{
                printf("error for malloc");
                return 0;
        }
        char *  p2=realloc(p,100);
        if(p){
                printf("OLDP_SIZE=%d\t%s\n",sizeof(p),p);
        }else{
                printf("OLDP Been Clear\n");
        }
        if(p2){
                memcpy(p2,"hello world longlonglonglonglonglonglong...",sizeof("hello world longlonglonglonglonglonglong..."));
                printf("SIZEOF=%d\t%s\n",sizeof(p2),p2);
        }else{
                printf("error for realloc\n");
        }
        return 1;
}

输出结果:

[[email protected] STDC]$ gcc stdc_realloc.c 
[[email protected] STDC]$ ./a.out 
SIZE=8	helloword
OLDP_SIZE=8	helloword
SIZEOF=8	hello world longlonglonglonglonglonglong...

真实作用:

1、如果有足够空间用于扩大mem_address指向的内存块,则分配额外内存,并返回mem_address

这里说的是“扩大”,我们知道,realloc是从堆上分配内存的,当扩大一块内存空间时

realloc()试图直接从堆上现存的数据后面的那些字节中获得附加的字节

如果能够满足,自然天下太平。也就是说,如果原先的内存大小后面还有足够的空闲空间用来分配,加上原来的空间大小= newsize。

那么就ok。得到的是一块连续的内存。
2、如果原先的内存大小后面没有足够的空闲空间用来分配,那么从堆中另外找一块newsize大小的内存。

并把原来大小内存空间中的内容复制到newsize中。返回新的mem_address指针。(数据被移动了)。

老块被放回堆上。

源码测试:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(){
        char *p=(char *)malloc(10);
        if(p){
        //      p="helloworld";
                memcpy(p,"helloword",sizeof("helloword"));
                printf("SIZE=%d\t%s\n",sizeof(p),p);
        }else{
                printf("error for malloc");
                return 0;
        }
        char *  p2=realloc(p,100);
        if(p){
                printf("OLDP_SIZE=%d\t%s\n",sizeof(p),p);
        }else{
                printf("OLDP Been Clear\n");
        }
        if(p2){                //memcpy(p2,"hello word longlong long long ",sizeof("hello word longlong long long ")); 
                printf("SIZEOF=%d\t%s\n",sizeof(p2),p2);
        }else{
                printf("error for realloc\n");
        }
        return 1;
}

测试结果:

[[email protected] STDC]$ gcc stdc_realloc.c 
[[email protected] STDC]$ ./a.out 
SIZE=8	helloword
OLDP_SIZE=8	helloword
SIZEOF=8	helloword
The bottom line, for me, is simple.

Let’s hope it doesn’t take 500 years for a discipline of testing to becomes the standard for software developers.

From:dayu

您好!请登录

合作网站快捷登录:
点击取消回复

已有0评论

    大宇博客

    点击这里给我发消息 点击这里给我发消息 点击这里给我发消息 点击这里给我发消息