C语言,realloc

void * realloc ( void * ptr, size_t new_size );

关于realloc的行为方式,结合源码总结为:
1. realloc失败的时候,返回NULL;

2. realloc失败的时候,原来的内存不改变,也就是不free或不move,(这个地方很容易出错);

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

4. 如果size为0,效果等同于free();

5. 传递给realloc的指针可以为空,等同于malloc;

6. 传递给realloc的指针必须是先前通过malloc(), calloc(), 或realloc()分配的。



#include <stdio.h>
#include <stdlib.h>

int main()
{
	char* p1 = 1;
	char* p2 = 1;
	char* p3 = 1;
	char* p4 = 1;
	char* p5 = 1;

	p1 = (char*)malloc(10);
	printf("1: p1 = %x\n", p1);

	p2 = (char*)malloc(0);
	printf("2: p2 = %x\n", p2);

	p3 = (char*)malloc(10);
	printf("3: p3 = %x\n", p3);

	p4 = realloc(p1, 20);
	if(p4 != 0){
		printf("4: p4 = %x\n", p4);
		printf("4: p1 = %x\n", p1);
	}else{
		printf("4 f: p4 = %x\n", p4);
		printf("4 f: p1 = %x\n", p1);
	}

	p5 = realloc(p3, 0);
	if(1){
		printf("5: p5 = %x\n", p5);
		printf("5: p3 = %x\n", p3);
	}

	return 0;
}
/*

1: p1 = 20a00
2: p2 = 21008
3: p3 = 20a18
4: p4 = 21410
4: p1 = 20a00
5: p5 = 21018
5: p3 = 20a18

分析:
void *malloc(size_t size);
void *realloc(void *ptr, size_t size);

1. malloc(0)成功后,返回一个非0的地址值;

2.realloc(ptr,size)成功后,返回新的地址值;ptr会被free,但这个地址值不会改变。
因此,如果使用p2 = realloc(ptr, size2)的形式,在realloc成功后,应该手动使ptr = 0,避免野指针; 如果使用ptr = realloc(ptr, size2),则不需处理。

3.realloc失败后,ptr不受影响,不会被free。

*/

  

参考:

1. Linux Programmer‘s Manual   http://www.man7.org/linux/man-pages/man3/malloc.3.html2. 关于realloc的调整内存方式 http://blog.csdn.net/dadoneo/article/details/8688593
时间: 2024-10-06 14:50:25

C语言,realloc的相关文章

C语言 realloc为什么要有返回值,realloc返回值详解/(解决任意长度字符串输入问题)。

在C语言操作中会用到大量的内存操作,其中很常用的一个是realloc(). 由字面意思可以知道,该函数的作用是用于重新分配内存. 使用方式如下: NewPtr=(数据类型*)realloc(OldPtr,MemSize) 其中OldPtr指向 待重新分配内存的指针. NewPtr指向 新分配空间的指针. MemSize为 分配后的空间大小. 该函数的使用涉及以下几个问题: 1.不同情况下的返回值 2.OldPtr指向的内存会不会自动释放 3.OldPtr和NewPtr分别是什么内容,他们有什么关

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

安全起见,小心使用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 所指向的内存块的大小修

C语言 realloc为什么要有返回值,realloc返回值具体解释/(解决随意长度字符串输入问题)。

在C语言操作中会用到大量的内存操作,当中非经常常使用的一个是realloc(). 由字面意思能够知道,该函数的作用是用于又一次分配内存. 使用方式例如以下: NewPtr=(数据类型*)realloc(OldPtr,MemSize) 当中OldPtr指向 待又一次分配内存的指针. NewPtr指向 新分配空间的指针. MemSize为 分配后的空间大小. 该函数的使用涉及下面几个问题: 1.不同情况下的返回值 2.OldPtr指向的内存会不会自己主动释放 3.OldPtr和NewPtr各自是什么

论C语言的malloc,calloc,new,realloc,alloca的机制和区别

最近笔试老是遇到关于C语言的malloc,new之类的内存机制问题,作为一个做java开发的程序员不免有些郁闷,驾驭不了.乘空闲下来的这些时间,好好整理下C语言中各个内存函数的简单机制,作用和区别: C语言内存分配方式 (1) 从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量,static变量. (2) 在栈上创建.在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放.栈内存分配运算内置于处理器的指令集

c语言中的内存分配malloc、alloca、calloc、malloc、free、realloc、sbr

C语言跟内存分配方式 (1) 从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量,static变量. (2) 在栈上创建.在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放.栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限. (3)从堆上分配,亦称动态内存分配.程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存.动态内存的

C语言:使用realloc函数对malloc或者calloc动态分配的内存大小进行扩展

#include<stdio.h> #include<stdlib.h> #include<time.h> typedef struct { char name[32]; int age; char gender; float score[3]; }Student; typedef struct { Student * pData;//学生信息 int size;//容量大小 int count;//当前的记录个数 }Database; //初始化数据库 int ini

C语言 malloc、calloc、realloc的区别

三个函数的申明分别是: void* malloc(unsigned size); void* realloc(void* ptr, unsigned newsize); void* calloc(size_t numElements, size_t sizeOfElement); 都在stdlib.h函数库内,它们的返回值都是请求系统分配的地址,如果请求失败就返回NULL.    (1)函数malloc()       在内存的动态存储区中分配一块长度为size字节的连续区域,参数size为需要

C语言扩展动态内存报错:realloc(): invalid next size: 0x0000000002365010 ***

晚上被这个内存扩展崩溃的问题折腾的有点崩溃,当答案揭晓的那一刻,恍然大悟,原来如此简单. 练习题目:输入一个字符串,根据字母进行排序,说白了就是一个简单的冒泡 #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h> #define BUF_LEN 100 #define COUNT 5 int main(void) { char buf[BUF_LEN];

C语言程序的内存布局

一:C语言程序的存储区域 C语言编写的程序经过编绎-链接后,将形成一个统一的文件,它由几个部分组成,在程序运行时又会产生几个其他部分,各个部分代表了不同的存储区域: 1.代码段(Code or Text): 代码段由程序中的机器码组成.在C语言中,程序语句进行编译后,形成机器代码.在执行程序的过程中,CPU的程序计数器指向代码段的每一条代码,并由处理器依次运行. 2.只读数据段(RO data): 只读数据段是程序使用的一些不会被更改的数据,使用这些数方式类似查表式的操作,由于这些变量不需要更改