精华内容
下载资源
问答
  • C语言realloc()函数

    2016-03-23 21:44:41
    C语言 realloc() 函数位于 stdlib.h 头文件中,其原型为:  void *realloc(void *ptr, size_t size); realloc() 会将 ptr 所指向的内存块的大小修改为 size,并将新的内存指针返回。 设之前内存块的大小为 n...

    C语言 realloc() 函数位于 stdlib.h 头文件中,其原型为:
        void *realloc(void *ptr, size_t size);


    realloc() 会将 ptr 所指向的内存块的大小修改为 size,并将新的内存指针返回。

    设之前内存块的大小为 n,如果 size < n,那么截取的内容不会发生变化,如果 size > n,那么新分配的内存不会被初始化。

    1. 如果 ptr = NULL,那么相当于调用 malloc(size);如果 size = 0,那么相当于调用 free(ptr)。
    2. 如果 ptr 不为 NULL,那么他肯定是由之前的内存分配函数返回的,例如 malloc()、calloc()或realloc()。
    3. 如果 ptr 所指的内存块被移动,那么会调用 free(ptr)。


    realloc是从堆上分配内存的.当扩大一块内存空间时,realloc()试图直接从堆上现存的数据后面的那些字节中获得附加的字节,如果能够满足,自然天下太平;如果数据后面的字节不够,问题就出来了,那么就使用堆上第一个有足够大小的自由块,现存的数据然后就被拷贝至新的位置,而老块则放回到堆上.这句话传递的一个重要的信息就是数据可能被移动.

    展开全文
  • 关于c语言realloc函数分配的内存上限测试1.测试环境2.测试方法之一,使用realloc函数不断分配更多的内存2.1测试方法2.1.1 首先使用malloc分配51.2MB内存2.1.2. 然后反复调用执行下面的步骤,看看可分配的内存上限是...

    1.测试环境

    OS: Ubuntu 18.04, kernel 5.0.0-27, 64位
    RAM:DDR3 8GB*2=16GB, 1600MT/S
    CPU: Intel® Xeon® CPU E5-2670 0 @ 2.60GHz
    编译器:gcc 7.3.0

    2.测试方法之一,使用realloc函数不断分配更多的内存

    2.1测试方法

    2.1.1 首先使用malloc分配51.2MB内存

    2.1.2. 然后反复调用执行下面的步骤,看看可分配的内存上限是多少.

    2.1.2.1 调用realloc函数分配更大的空间,增量为51.2MB
    2.1.2.2 realloc完成后,调用memset将分配的内存清0

    2.2.测试结果

    2.2.1.开始,可用内存13GB左右,swap分区使用率为0%
    2.2.2.调用realloc,多数情况下,只需10-30微秒,少数情况则需要500多微秒.
    2.2.3. memset则比realloc慢得多,且随着尺寸的扩大,memset越来越慢.
    当尺寸达到8GB,需要1秒.
    当尺寸达到13GB,需要1.5秒
    当尺寸达到15.8GB,需要2秒.
    当尺寸达到16.18GB,需要4.27秒
    当尺寸达到16.23GB,需要5分钟

    2.2.4交换分区的使用
    当尺寸达到13.9GB左右,开始使用swap分区
    当尺寸达到15.25GB,swap分区使用量达到236MB
    当尺寸达到16GB左右,swap分区使用量达到1GB
    当尺寸达到16.28GB左右,swap分区使用量达到1.3GB

    3.测试方法之二,使用C++的vector.resize()方法,不断分配更大的内存

    3.1.方法.反复调用vector的resize成员函数,每次分配更大的空间,增量为51.2MB

    3.2.测试结果

    3.2.1.开始,可用内存13GB左右,swap分区使用率为0%
    3.2.2.调用vector的resize,速度与空间大小没有明显的关系,在大部分情况下,可以在0.02秒以内完成.
    3.2.3.调用resize的参数超过13.1GB时,抛出异常std::bad_alloc
    3.2.4.在整个过程,swap分区的使用量始终为0%

    展开全文
  • 安全起见,小心使用C语言realloc()函数 http://www.360doc.com/content/16/0712/09/19227797_574892368.shtml 在C语言中,良好的编程习惯要求一个函数只做一件事,如果一个函数实现了若干功能,可以说基本是一个...

    安全起见,小心使用C语言realloc()函数

    http://www.360doc.com/content/16/0712/09/19227797_574892368.shtml

    在C语言中,良好的编程习惯要求一个函数只做一件事,如果一个函数实现了若干功能,可以说基本是一个糟糕的设计。

    C语言 realloc() 函数位于 stdlib.h 头文件中,其原型为:
        void *realloc(void *ptr, size_t size);

    realloc() 会将 ptr 所指向的内存块的大小修改为 size,并将新的内存指针返回。

    设之前内存块的大小为 n,如果 size < n,那么截取的内容不会发生变化,如果 size > n,那么新分配的内存不会被初始化。

    如果 ptr = NULL,那么相当于调用 malloc(size);如果 size = 0,那么相当于调用 free(ptr)。

    如果 ptr 不为 NULL,那么他肯定是由之前的内存分配函数返回的,例如 malloc()、calloc()或realloc()。

    如果 ptr 所指的内存块被移动,那么会调用 free(ptr)。

    看吧,一个简单的 realloc() 却赋予了好几个功能,这并不是良好的函数设计。估计也是为了兼容性,才容忍这个函数一直在C库中。虽然在编码中,realloc() 会提供一定的方便,但是也很容易引发Bug。

    下面就举两个例子,来说明一下。

    1) realloc() 第一种行为引发的Bug

    1. void *ptr = realloc(ptr, new_size);
    2. if (!ptr) {
    3. // 错误处理
    4. }

    这里就引出了一个内存泄露的问题,当realloc() 分配失败的时候,会返回NULL。但是参数中的 ptr 的内存是没有被释放的。如果直接将realloc()的返回值赋给ptr。那么当申请内存失败时,就会造成ptr原来指向的内存丢失,造成内存游离和泄露。

    正确的处理应该是这样:

    1. void *new_ptr = realloc(ptr, new_size);
    2. if (!new_ptr) {
    3. // 错误处理。
    4. }
    5. ptr = new_ptr


    2) 第三种行为引发的Bug
    实际上,malloc(0)是合法的语句,会返还一个合法的指针,且该指针可以通过free去释放。这就造成了很多人对realloc()的错误理解,认为当size为0时,实际上realloc()也会返回一个合法的指针,后面依然需要使用free去释放该内存。

    1. void *new_ptr = realloc(old_ptr, new_size);
    2. //其它代码
    3. free(new_ptr);

    由于错误的认识,不去检验new_size是否为0,还是按照new_size不为0的逻辑处理,最后并free(new_ptr)。这里就引入了double free的问题,造成程序崩溃。

    所以,realloc() 这个设计并不怎么优良的函数陷阱还是不少的,一不小心就踩雷了,上面只是两个简单的小例子,大家在实际使用的时候还应该注意一些其他小问题。

    转载于:https://www.cnblogs.com/igfirstblog/p/7592030.html

    展开全文
  • C语言realloc雷区

    2020-09-24 21:04:37
    对这篇文章进行补充...realloc(p,size)其中p必须是之前动态分配内存的地址,不能是开辟数组的地址比如 int a[100]; int *p=a; int *q=realloc(p,200); 这样写是错误的!因为a的大小不可改变! ...

    对这篇文章进行补充http://c.biancheng.net/cpp/html/2536.html
    realloc(p,size)其中p必须是之前动态分配内存的地址,不能是开辟数组的地址比如
    int a[100];
    int *p=a;
    int *q=realloc(p,200);
    这样写是错误的!因为a的大小不可改变!

    展开全文
  • 首先我申请了长度为10的空间 int *p p=(int*)malloc(10*sizeof(int)); 我想把长度延长为20 且原来的数据要保留 p=(int*)realloc(p,a*sizeof(int)); 这个a应该是10 还是 20 感谢各位大神解答
  • C语言realloc函数解析

    2016-09-16 11:29:22
    void *realloc(void *ptr, size_t size); 作用:更改已经配置的堆内存空间,说白了在C语言中就是更改由malloc()函数分配的内存空间的大小。 当需要将已分配的内存减小时,则返回原指针,仅仅是对应索引的内存空间...
  • 小心使用C语言realloc()函数

    千次阅读 2015-05-04 14:54:36
    C语言中,良好的编程习惯要求一个函数只做一件事,如果一个函数实现了若干功能,可以说基本...C语言 realloc() 函数位于 stdlib.h 头文件中,其原型为:  void *realloc(void *ptr, size_t size); realloc
  • [WIP]C语言 realloc的坑

    2019-01-07 07:59:00
    创建: 2019/01/07 ...回到主题,在用动态循环数组实现queue的时候, 由于realloc的原因出现了一些莫名其妙的错误。 先开个题,晚点补上 转载于:https://www.cnblogs.com/lancgg/p/10231307.html...
  • 带着内存游走的函数——reallocrealloc写了一个栈的实现,出现一个间歇性bug realloc把base指针带走了,top指针乖乖滴留在家里吃屎
  • C语言 realloc() 函数位于 stdlib.h 头文件中,其原型为:  void *realloc(void *ptr, size_t size); realloc() 会将 ptr 所指向的内存块的大小修改为 size,并将新的内存指针返回。 设之前内存块
  • #define STACKSIZE sizeof(int) int main() { int a,b,num=0;...但是在result=(int*)realloc(result,(sizeof(int)+STACKSIZE))这个地方总是错误,我是想输入一组值分配一个空间的。求大神解答。
  • [img=... 如图和代码 realloc后分配空间不够了,为什么4,5还可以输出,但是3却不能,我将两次的地址输出发现realloc后没有改变原地址,但为什么3就不能输出了???
  • malloc():ElemType * head=(ElemType *)malloc(SIZE*sizeof(ElemType));...—————————-realloc(): //更改由malloc()分配的空间 head=(ElemType *)realloc(head,(SIZE+10)*sizeof(ElemType));将 h
  • LZ目前自学C语言 在写小程序的时候遇到一些问题 请各位大牛赐教一下 非常感谢 关联问题1:realloc触发断点问题 描述:LZ想要通过realloc实现动态数组 结果发现程序运行在realloc的时候 经常会停掉 为此调试后...
  • realloc,malloc,calloc的区别 三个函数的申明分别是:  void* realloc(void* ptr, unsigned newsize);  void* malloc(unsigned size);  void* calloc(size_t numElements, size_t sizeOfElement);  都在...
  • 转载自:... 三个函数的申明分别是:void* realloc(void* ptr, unsigned newsize);void* malloc(unsigned size);void* calloc(size_t numElements, size_t sizeOfElement...
  • C语言操作中会用到大量的内存操作,其中很常用的一个是realloc().  由字面意思可以知道,该函数的作用是用于重新分配内存。  使用方式如下:  NewPtr=(数据类型*)realloc(OldPtr,MemSize)  其中OldPtr...
  • C语言操作中会用到大量的内存操作,当中非经常常使用的一个是realloc(). 由字面意思能够知道,该函数的作用是用于又一次分配内存。 使用方式例如以下: NewPtr=(数据类型*)realloc(OldPtr,MemSize) ...
  • C语言函数realloc

    2012-10-26 09:20:11
    C语言函数realloc  原型:extern void *realloc(void *mem_address, unsigned int newsize);  语法:指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小)。//新的大小一定要大于原来...
  • C语言realloc

    2015-09-01 15:45:00
    void * realloc ( void * ptr, size_t new_size ); 关于realloc的行为方式,结合源码总结为:1. realloc失败的时候,返回NULL; 2. realloc失败的时候,原来的内存不改变,也就是不free或不move,(这个地方很容易...
  • c语言realloc()函数解析 真是有点惭愧,这些内容本应该很早就掌握的,以前只是糊里糊涂的用,不知道在内存中具体是怎么回事,现在才弄清楚。 realloc(void *__ptr, size_t __size):更改已经配置的内存空间,...
  • C语言realloc函数

    2018-05-11 14:59:25
    realloc 使用详解(分析realloc invalid pointer、指针无效等错误) realloc函数用来为ptr重新分配大小为size的一块内存,看似很简单,在使用过程中却会发生各种错误。 函数形式为: void * realloc ( void ...
  • C语言中,用到指针就会想到动态分配空间,动态分配空间最基础的就是malloc。 头文件:stdlib.h或malloc.h(realloc和calloc也一样) void *malloc(size_t size); 功能:分配长度为num_bytes字节的内存...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,345
精华内容 538
关键字:

c语言realloc

c语言 订阅