malloc,calloc,realloc的使用及函数声明

malloc动态开辟内存空间
*函数声明:void malloc(unsigned size);

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//malloc  动态开辟内存空间
int main() {
	char buf[20] = "welcome to xian";
	char* name;
	name = (char*)malloc(sizeof(char) * 20);
	strcpy(name, buf);
	printf("%s\n", name);
	free(name);
	if (name != NULL) {
		name = NULL;
	}
	return 0;
}

calloc动态开辟内存空间
函数声明:void calloc (size_t num, size_t size);*

//calloc动态开辟内存空间

int main() {
	int* p;
	p = (int*)calloc(10, 4);
	for (int i = 0; i < 10; ++i) {
		p[i] = 2 * i + 1;
		printf("p[%d]=%d\n", i, p[i]);
	}
	free(p);
	if (p != NULL) {
		p = NULL;
	}
	return 0;
}

realloc动态开辟内存空间
函数声明:void * realloc ( void * ptr, size_t new_size );
1.ptr必须为NULL,或者为malloc,realloc或者calloc的返回值,否则发生realloc invalid pointer错误
2.new_size如果小于old_size,只有new_size大小的数据会被保存,可能会发生数据丢失,慎重使用。
3.如果new_size大于old_size,可能会分配一块新的内存,这时候ptr指向的内存会被释放,ptr成为野指针,再访问的时候会发生错误。
4.最后不要将返回结果再赋值给ptr,即ptr=realloc(ptr,new_size)是不建议使用的,因为如果内存分配失败,ptr会变为NULL,如果之前没有将ptr所在地址赋给其他值的话,会发生无法访问旧内存空间的情况,所以建议使用temp=realloc(ptr,new_size)。

//realloc重新规定分配的内存

int main() {
	char*p = (char*)malloc(sizeof(char) * 2);
	strcpy(p, "p");
	//realloc参数中的指针必须是malloc,calloc,realloc的返回值
	//如果realloc分配的内存大小大于旧指针大小,则重新分配新内存,
	//旧的指针自动释放,成为野指针,后续操作野指针属于非法操作
	char* p2=realloc(p, sizeof(char) * 30);
	//条件判定一下,如果分配失败直接返回
	if (p2 == NULL) {
		printf("动态内存分配失败\n");
		return -1;
	}
	strcpy(p2, "welcome to xian!");
	printf("%s\n", p2);
	//free(p);//后续操作旧指针,属于非法操作
	//p = NULL;
	free(p2);
	p2 = NULL;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/a_hang_szz/article/details/89437768