realloc的用法

一,我们来认识一下realloc函数、

void* realloc(void* ptr, size_t size)
  上面这个是realloc的函数原型,从中可以知道:

  1. void* pty : 这个是需要扩容的指针。
  2. size_t size : 重新分配的空间(单位为字节) 。
  3. 分配成功,返回void*指针(指向重新分配的字节数为size的内存块地址)
  4. 分配失败,返回NULL值。

二,realloc函数如何使用

1. 原地扩容 :

  这种情况出现在与原来指针指向的地址块后面的地址没有被分配,尚且空闲,于是realloc就直接在原来地址块后面直接扩容,分配新的空间。如下图:
在这里插入图片描述

2.异地扩容 :

  当原来指针指向的地址块后面的地址已经被分配,或者后面空闲地址的大小不够时,会在重新开辟新的地址,将原来地址块中的数据复制到新的地址中,然后会自动释放原来的地址空间。
如下图:
在这里插入图片描述

3.我们用代码示例出来:

//尾插法
void SLPushBack(SL* ps, SLDataType x) {

	//实现动态数组,容量就得实时监视,容量不够时扩容。
	if (ps->size == ps->capacity) {
		// 首先对容量进行判断,如果容量=0,那就初始化为4,否则就扩容为原来的二倍。
		int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		//void *realloc(void *ptr, size_t size); size_t size  : 重新分配的空间(单位为字节) ,pty : 需要扩容的指针。
		SLDataType* tmp = (SLDataType*)realloc(ps->a, newCapacity*sizeof(SLDataType)); 
		
		//分配成功返回重新分配的字节数为size的内存块地址
		// 分配失败返回 NULL。
		if (tmp == NULL) {
			printf("realloc fail \n");
			exit(-1);
		}
	}
	ps->a[ps->size] = x; // x 是要插入的数据 。
	ps->size++; // size就是数据的数量,所以跟随尾插的次数而变化。
}

这是用C语言写的对顺序表的尾插法,代码中有解释,在这里不做过多阐述。

4.关于缩容

  realloc(ps -> a, 0);//将内存大小置为0,同时自动释放原来的内存。也就是realloc(ps -> a, 0)等效于free(ps)

  新人创作不易,你的点赞和关注都是对我莫大的鼓励,再次感谢您的观看。

猜你喜欢

转载自blog.csdn.net/tang20030306/article/details/129958749