想学编程的Noob 发表于 2018-12-9 09:25:51

C语言动态内存分配

题目:输入一个变量N,在输入N个数,计算平均值,最大值,最小值并输出,建议用动态内存分配实现

我的代码:
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int i,N;
float average=0,max,min,*p=NULL;
scanf("%d",&N);
p = (float *)malloc(N*sizeof(float));
for(i=0;i<N;i++);
    scanf("%f",&p);
max = p;
min = p;
for(i=0;i<N;i++)
{
    average += p;
    if(p>max)
      max = p;
    if(p<min)
      min = p;
}
free(p);
average /= N;
printf("average = %.2f\nmax = %.2f\nmin = %.2f\n",average,max,min);
return 0;
}
使用VC6        编译没有错误,运行时弹出Debug Error

想学编程的Noob 发表于 2018-12-9 09:27:00

如果可以是不是能再说下malloc,calloc,free的正确用法

qq1242009750 发表于 2018-12-9 11:17:10


----------------------------------------------------------------------------------------------------------------
for语句后面加多了一个分号这个是一个语法错误 带式编译器发现不出来

malloc : 在程序预留的堆空间里开辟指定大小的内存(不把开辟内存的内容初始化为0),这块内存的生命周期是把这块内存释放之前,他的作用域是整一个程序,因为省去了初始化的时间,所以这个函数的等待时间要比calloc快,也就是说效率更高

calloc: 在程序预留的堆空间里开辟指定大小的内存(把开辟内存的内容初始化为0),这块内存的生命周期是把这块内存释放之前,他的作用域是整一个程序,因为要初始化内存,所以函数的效率比malloc要低

free : 释放已开辟的内存,当释放完后记得把指向内存的指针赋值为NULL,以免出现无效内存的访问。

如果你嫌弃直接调用malloc函数很麻烦,那你可以把他封装为一个宏:

#define MALLOC(t,n) (t*)malloc((n)*sizeof(t))

t 代表了数据的类型n代表了数据的个数。

citrus0 发表于 2019-5-14 13:42:41

原来我也是这个错误{:10_247:}
页: [1]
查看完整版本: C语言动态内存分配