练习动态内存开辟

malloc
void* malloc (size_t size);
这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。
1.如果开辟成功,则返回一个指向开辟好空间的指针。
2.如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。
3.返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。
4.如果参数 size 为0,malloc的行为是标准是未定义的,取决于编译器。

#include <stdio.h>
#include <stdlib.h>
int main()  {
	int* p = (int*)malloc(10 * sizeof(int));
	if (p!=NULL) {
		for (int i = 0; i < 10; ++i) {
			p[i] = i;
		}
	}
	for (int i = 0; i < 10; ++i) {
		printf("%d\n",p[i]);
	}
	free(p);
	p = NULL;
	system("pause");
	return 0;
}
}

callor
void* calloc (size_t num, size_t size);

函数的功能是为 num 个大小为 size 的元素开辟一块空间,并且把空间的每个字节初始化为0。

#include <stdio.h>
#include <stdlib.h>
int main()  {
	int* p = calloc(10, sizeof(int));
	if (p != NULL) {
		//for (int i = 0; i < 10; ++i) {          //手动初始化
		//	p[i] = i;
		//}
	}
		for (int i = 0; i < 10; ++i) {
				printf("%d\n",p[i]);
		}
		free(p);
		p = NULL;
	system("pause");
	return 0;
}

realloc
void* realloc (void* ptr, size_t size);
如果将分配的内存减少,realloc仅仅是改变索引的信息。

如果是将分配的内存扩大,则有以下情况:
1)如果当前内存段后面有需要的内存空间,则直接扩展这段内存空间,realloc()将返回原指针。
2)如果当前内存段后面的空闲字节不够,那么就使用堆中的第一个能够满足这一要求的内存块,将目前的数据复制到新的位置,并将原来的数据块释放掉,返回新的内存块位置。
3)如果申请失败,将返回NULL,此时,原来的指针仍然有效。
注意:如果调用成功,不管当前内存段后面的空闲空间是否满足要求,都会释放掉原来的指针,重新返回一个指针,虽然返回的指针有可能和原来的指针一样,即不能再次释放掉原来的指针。

free
搭配malloc calloc realloc使用
void free (void* ptr);
free函数用来释放动态开辟的内存。 如果参数 ptr 指向的空间不是动态开辟的,那free函数的行为是未定义的。
如果参数 ptr 是NULL指针,则函数什么事都不做。

猜你喜欢

转载自blog.csdn.net/Lange_Taylor/article/details/89504583