malloc函数动态分配数组,free释放内存
//动态数组
#include
#include //为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));
malloc函数在动态分配数组空间时,只会增大空间,不会减小空间,所以说如果不释放内存,可能会造成内存溢出。因为如果地址没了,内存被占了但是还无法调用,就很难受
eg