当前位置:首页 > 内存 > 正文

c动态内存分配(c查看动态内存分配统计)

  • 内存
  • 2024-05-25 04:38:57
  • 7724

一、关于c语言动态内存分配的问题内存分配通常使用stdlib.h中的两个函数:malloc和free
malloc的原型为:void*malloc(size_tsize);
含义是从内存堆首地址分配连续的size字节该空间的地址,也称为基地址。
为什么返回无效的*地址类型?因为C运行时库不知道程序员分配的空间中存储了什么类型的值,所以只能返回void*。
虽然运行时库不知道分配的空间中存储的是什么类型,但程序员知道,所以程序中需要进行强制类型转换。
C语言有一个用于可移植性的关键字,称为sizeof。它检测某种类型的值占用的空间大小。大小的测量单位是字节。,双精度实数占用的空间大小=sizeof(double)。
如果要动态分配10个int值的内存空间,则内存空间的大小=10*sizeof(int)。我想你明白了。该空间的起始地址类型是int*。你知道什么吗?因为空格里都是整数,如果不是int*还能是什么,对吧?好的,下面的程序片段出来了:
int*p;
p=(int*)malloc(10*sizeof(int));
看看能不能,就在这里。强制类型转换,从void*==》int*,原因前面已经解释清楚了。
如果空间很小,无法容纳10个整数怎么办?malloc非常占主导地位,返回0地址,即符号常量NULL。不用担心,有足够的空间,malloc一定会成功分配给你的,也就是说,它会返回给你一个非0的地址。那么在上面的语句之后,程序员会接着执行另一条语句:
if(!p)exit(0);
表示程序结束。当然,也可以根据需要进行其他处理。
看到这里,我想您已经习惯使用malloc动态分配内存了。
当分配的空间用完,以后不再需要的时候,记住一句话“借得容易,归还也容易”,这个空间必须归还给堆,否则就会发生内存泄漏,si使用的内存空间越多,它就会变得越少。你就会明白最终的结果。
为了更方便,请免费使用。原型如下:
voidfree(void*);
表示将malloc分配的基地址作为参数传递给它,由它负责释放。
释放上面分配的空间的语句如下:
free(p);
注意,如果发送的不是该空间的基地址,通过malloc分配的话,哈哈,后果自负。例如:
p=(double*)malloc(20*sizeof(double));
....
p++;
....
free(p);
如果你敢像上面这样写,自由意志就敢罢工,为什么要借多还少呢?我给你点颜色看看,希望你不知道。
写的就是这些,希望对你有帮助。虽然写了这么多,但我还是不得不佩服自己。看来我真是个好人啊,哈哈哈哈。
(完)
二、c语言程序设计(关于动态内存分配)问题。高手进

#include

#include

#include

voidmain()

<

intn,i,k,m,sum=0,*p,high_score,low_score;//定义常量

floatave_score;

printf("请输入学生人数:");

scanf("%d",&n);

p=(int*)malloc(n*sizeof(int));//动态内存分配

if(p==NULL)

printf("没有足够的可用内存。");

exit(0);

}

printf("输入学生成绩:\n");

for(i=0;i

scanf("%d",p+i);//输入学生的分数

for(k=0;k

{

*(p+k))

{

m=*p;

*p=*(p+k);

*(p+k)=m;

}

}

for(k=0;k

<

if(*(p+n-1)<*(p+k))//这里你错了,有n个学生,其地址应该是

{                                                               n-1,您正在使用p+n,指向任何数字,错误。

                                 m=*(p+n-1);

*(p+n-1)=*(p+k)同样,两者都是p+n-;1

*(p+k)=m;

}

}

for(i=0;i

sum+=*(p+i);

ave_score=sum*1.0/n;

hign_score=*(p+n-1);//也应该是p+n-1

low_score=*p;

printf("学生平均成绩为%f\n",ave_score);//输出

printf("学生的最高分是%d\n",highn_score);

printf("学生的最低分是%d\n",low_score);

free(p);

}

PS:指针问题容易出错。使用需要注意的事项。如果没有语法错误,如果有错误,通常是指针地址有问题。

程序正确,有结果运行。解贴吧