C语言realloc的用法

int *newbase = (int*)realloc(oldbase,(old_length+5)*sizeof(int))
realloc是指在原先的那块内存上在其后方添加了5个内存空间,还是重新又找了块空间一下分配出来?oldbase = newbase这一步需不需要?如果说是在原来那块内存上接着分配增加的空间,那恰好这连续的空间正好正被使用,那realloc函数岂不是极其容易分配失败?而如果又重新找了一块空间一下分配,那之前使用的的那部分内存岂不是泄露了?

void *realloc(void *p,size_t size)

realloc函数将p指向的对象的长度修改为size个字节,如果新分配的内存比原来的大,则原来的数据保持不变,增加的空间不进行初始化。

如果新分配的内存比原来的内存小,则新的内存空间不被初始化,realloc函数返回指向新分配空间的指针,若无法满足要求则返回NULL 指针,在这种情况下,原指针p指向的单元内容保持不变。

扩展资料:

使用总结

1、ealloc失败的时候,返回NULL

2、realloc失败的时候,原来的内存不改变,不会释放也不会移动

3、假如原来的内存后面还有足够多剩余内存的话,realloc的内存=原来的内存+剩余内存,realloc还是返回原来内存的地址。

 假如原来的内存后面没有足够多剩余内存的话,realloc将申请新的内存,然后把原来的内存数据拷贝到新内存里,原来的内存将被free掉,realloc返回新内存的地址。

参考资料来源:百度百科-realloc

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-06-28

1、程序都需要包含 main() 函数。 代码从 main() 函数开始执行。

2、/* ... */ 用于注释说明。

3、printf() 用于格式化输出到屏幕。printf() 函数在 "stdio.h" 头文件中声明。

4、stdio.h 是一个头文件 (标准输入输出头文件) , #include 是一个预处理命令,用来引入头文件。

5、 当编译器遇到 printf() 函数时,如果没有找到 stdio.h 头文件,会发生编译错误。

6、return 0; 语句用于表示退出程序。

本回答被网友采纳
第2个回答  推荐于2017-09-23

  原型:extern void *realloc(void *ptr, size_t newsize);

  用法:#include <stdlib.h>

  功能:改变ptr所指内存区域的大小为newsize长度。

  说明:如果重新分配成功则返回指向被分配内存的指针,否则返回空指针NULL。

  当内存不再使用时,应使用free()函数将内存块释放。

  示例:

   #include <stdio.h>
  #include <stdlib.h>
  int main(int argc, char **argv)
  {
  char *p;
  p = (char *)malloc(100);
  if(p)
  printf("Memory Allocated at:%p\n", p);
  else
  printf("Not Enough Memory!\n");
  p = (char *)realloc(p, 256);
  if(p)
  printf("Memory Reallocated at:%p\n", p);
  else
  printf("Not Enough Memory!\n");
  free(p);
  return 0;
  }
  延伸:通常,realloc的用法会如下:
  p = realloc(p, new_size);
  if (p == NULL) {
  return;
  }

  如果realloc()失败,ptr指向的这块内存不会变化,不会free或者移动。也就是说,如果realloc()失败了,照着上面代码的写法,这块内存就被永远遗忘。

   tmp = realloc(p, new_size);
  if (tmp == NULL) {
  free(p);
  return;
  }
  p = tmp;

第3个回答  推荐于2017-09-19
  是否在其后方添加还是重新找空间,取决于oldbase后的连续空间是否足够。realloc会首先判断oldbase后是否有足够要求的新空间,若有,则扩大oldbase指向的地址空间;若没有,就重新另外分配一块地址空间,并将原有数据拷贝到新的空间,然后释放掉原有内存空间,同时返回新分配的内存空间首地址。
  至于oldbase = newbase是不必须的,就是也可以把两步合成一步:
oldbase = (int*)realloc(oldbase,(old_length+5)*sizeof(int))本回答被提问者采纳
第4个回答  2013-03-02
原型:extern void *realloc(void *mem_address, unsigned int
newsize);语法:指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小)。//新的大小一定要大于原来的大小,不然的话会导致数据丢失!说明:先判断当前的指针是否有足够的连续空间,如果有,扩大mem_address指向的地址,并且将mem_address返回,如果空间不够,先按照newsize指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来mem_address所指内存区域,同时返回新分配的内存区域的首地址。即重新分配存储器块的地址。
相似回答