C语言动态内存空间分配(malloc,calloc,realloc,free)

为了代码观感美观,我将代码部分的注释删了

malloc

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

//使用动态内存分配函数的注意事项:
//1.要判断指针是否为空指针,如果没有成功开辟动态内存空间,则不能继续使用该指针
//2.分配的动态内存空间的数量要大于等于赋值的元素的数量,不能造成动态内存的越界访问
//3.动态内存空间中的地址是在堆区,不能将非动态内存空间的地址赋值给堆区,
//  但可以将变量的值赋值给动态内存空间所指向的位置
//4.不能对非动态内存空间的地址进行free释放

// 动态内存分配 malloc(wantMemorySize)
int main(){
	int* p = (int*)malloc(10 * sizeof(int));
	if (p == NULL){
		printf("%s\n", strerror(errno));
	}
	else{
		for (int i = 0; i < 10; i++){
			*(p + i) = i;
			int num = *(p + i);
			printf("%d\t", num);//0       1       2       3       4       5       6       7       8       9
		}
	}

	//当申请的动态内存空间不再使用时,应该还给系统
	printf("\n%d\n", p[4]);//4
	free(p);
	//free之后还要置为NULL,否则成为野指针,因为地址还在,只是地址里面的值没了
	p[5] = 1;
	printf("%d\n%d\n", p[4],p[5]);// -572662307  1
    p = NULL;
	return 0;
}

calloc

// calloc(count,sizeof(Type))默认将开辟的动态内存数组空间置为0, 因为初始化了,所以效率比malloc低。
int main(){
	int* p = (int*)calloc(10, sizeof(int));
	if (p == NULL){
		printf("%s\n", strerror(errno));
	}
	else{
		for (int i = 0; i < 10; i++){
			printf("%d\t", p[i]);
		}
	}
	// free函数用来释放动态内存空间的
	free(p);
	p = NULL;
	return 0;
}

realloc

//realloc(oldMemoryAddress , wantMemorySize)
//调整开辟的动态内存空间的大小
int main(){
	// 先使用malloc开辟20个字节的空间
	int* p = (int*)malloc(5 * sizeof(int));
	if (p == NULL){
		printf("%s\n", strerror(errno));
	}
	else{
		for (int i = 0; i < 5; i++){
			*(p + i) = i;
			printf("%d\t", *(p + i));//0       1       2       3       4
		}
		printf("\n");
	}
	//假设20个字节不能满足我们的使用了
	//现在希望有40个字节的动态内存空间可以使用
	//realloc调整开辟的动态内存空间的大小
	//1.realloc如果旧地址后面的空间能够满足新增的空间大小,就追加到旧地址的后面,返回旧地址
	//2.否则就开辟一块新的动态内存空间,将旧动态内存空间中的值拷到新动态内存空间中相应的位置,
	//  然后释放旧的动态内存空间,返回新动态内存空间的地址
	int* p_realloc = (int*)realloc( p , 40);
	if (p_realloc == NULL){
		printf("%s", strerror(errno));
	}
	else{ 
		//不管是新地址还是旧地址依然给p管理,达到为p增加动态内存空间的目的
		p = p_realloc;

		for (int i = 5; i < 10; i++){
			*(p + i) = i;
		}
		for (int i = 0; i < 10; i++){
			printf("%d\t", *(p + i));//0       1       2       3       4       5       6       7       8       9  
		}
	}
	//因为p和realloc存放的地址是一样的,只需要把p放了就行
	free(p);
	p = NULL;
	p_realloc = NULL;
	return 0;
}



//realloc也可以和malloc一样开辟动态内存空间
//realloc(NULL,memorySize)
int main(){
	int* p = realloc(NULL, 10 * sizeof(int));
	if (p == NULL){
		printf("%s", strerror(errno));
	}
	else{
		for (int i = 0; i < 10; i++){
			*(p + i) = i;
			printf("%d", *(p + i));//0123456789
		}
	}
	free(p);
	p = NULL;

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值