malloc函数

malloc函数动态分配数组,free释放内存

//动态数组 
#include<stdio.h>
#include<stdlib.h>	//为malloc()和free函数提供原型
int main(void){
	double * ptd;
	int max;
	int number;
	int i=0;
	puts("What is the maximum number of type double entries?");
	scanf("%d",&max);
	ptd = (double *)malloc(max * sizeof(double));
	if(ptd==NULL){
		puts("Memory allocation failed. Goodbye.");
		exit(EXIT_FAILURE);
	}
	//ptd 现在指向有max个元素的数组
	puts("Enter the vales(q to quit):");
	while(i< max &&scanf("%lf",&ptd[i])==1)
		i++;
	printf("Here are your %d entries:\n",number=i);//这个时候i=max  输出的%d是number,number=i=max 
	for(i=0;i<number;i++){
		printf("%7.2f",ptd[i]);
		if(i%7==6)			//7个一换行。i从0开始, i%7=6时,已经输出了7个 
		printf("\n"); 
	}
		if(i%7!=0)			//与上面的对应,如果正好就不用再换行,不正好就再换一次。 
			putchar('\n');
			puts("Done.");
			free(ptd);
	return 0; 
} 

上面的代码是用malloc函数动态分配了一个double型数组也可以将其分配给一个int型数组。
而 malloc 则必须由我们计算要字节数,而且在返回后强行转换为实际类型的指针。

int* p;

p = (int *) malloc (sizeof(int));

第一、malloc 函数返回的是 void * 类型,假设你写成:p = malloc (sizeof (int)); 则程序无法通过编译,报错:“不能将 void* 赋值给 int * 类型变量”。所以必须通过 (int *) 来将强制转换。

第二、函数的实參为 sizeof (int) ,用于指明一个整型数据须要的大小。假设你写成:

int* p = (int *) malloc (1);

代码也能通过编译,但其实仅仅分配了 1 个字节大小的内存空间,当你往里头存入一个整数,就会有 3 个字节无家可归,而直接 “住进邻居家”!造成的结果是后面的内存中原有数据内容所有被清空。
关于上面代码一些解释:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

需要把指针类型修改为int,malloc函数这样写:ptd = (int *)malloc(max * sizeof(int));输出的也要更改为%d

int * ptd;		
ptd =int *)malloc(max *sizeof(int));

free()函数的重要性

malloc函数在动态分配数组空间时,只会增大空间,不会减小空间,所以说如果不释放内存,可能会造成内存溢出。因为如果地址没了,内存被占了但是还无法调用,就很难受
eg
在这里插入图片描述

  • 21
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值