C/C++——动态内存分配

动态内存分配,就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。动态内存分配不像数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小

上面是对于动态内存分配的介绍。下面说一下C语言与C++的动态内存分配的区别:

  1. c中 函数 malloc-free 是函数;c++中 关键字 new-delete 是关键字。
  2. malloc 不能给创建的空间初始化。返回值是void*,不能直接使用;
    new 可以给创建的空间初始化。返回的是指针,是创建空间类型的指针。

在说动态内存分配之前我觉得有必要说一下内存空间的生命周期。

  1. 堆: 自定义的 malloc创建 free释放,要避免内存泄漏(只创建不释放)。
  2. 栈:定义变量的作用域开始执行创建,执行结束释放。
  3. 静态: 程序运行时创建(或者第一次使用时创建),程序结束释放。

下面先说下C语言的动态内存分配。
malloc为动态内存分配, 当分配成功时,就返回 这块内存的首地址。

int *p = malloc(100 * sizeof(int));//整型的动态内存分配格式。
char *p = malloc(100 * sizeof(char));//字符型的动态内存分配格式
注:malloc前最好加上类型,例如:(char*)malloc(100 * sizeof(char));

现在说一道例题:学生人数由输入确定,动态分配内存,保存学生成绩,然后求出学生平均成绩

#include 
#include 
int main()
{
	int n, i, sum = 0;
	scanf("%d", &n);
	int *p = malloc(n * sizeof(int));//分配地址,分配了n个int
	for(i = 0; i < n; i++)//简单for循环
	{
		scanf("%d", &p[i]);//输入学生成绩
		sum += p[i];
	}
	printf("avg is %d\n", sum / n);
}

注:
1动态内存分配,不会自动释放,需要在程序里释放 ,这时就需要“free”,通常 malloc 和 free要成对出现。

free(p);

2动态内存分配可能会不成功,如果分配失败,malloc返回值为NULL,所以,分配后要检查p是不是NULL。

下面再写一道题目:输出学生成绩(动态分配):输入学生人数后输入每个学生的成绩,最后输出学生的平均成绩、最高成绩和最低成绩。要求使用动态内存分配来实现。

#include
#include
int main ( )
{
   int n, i;
   float *p, sum, max, min;//定义变量
   printf("请输入学生的人数: ");
   scanf("%d", &n);
   if ((p=malloc(n*sizeof(float))) == NULL) //报错提醒,同时动态分配n个float型内存
   {
       printf("WOW!ERROR \n");
       exit(1);
   }
   sum=0;//初始化
   max=-1;//初始化
   min=1000;//初始化
   printf("请录入 %d 个成绩: ", n);
   for (i = 0; i < n; i++){
        scanf("%f", p+i);
        sum=sum+*(p+i);
        if (min>*(p+i))
            min=*(p+i);
        if (max<*(p+i))
          max=*(p+i);
   }
   printf("平均分是 %f, 最高分是 %f, 最低分是 %f\n",sum/n,max,min);
   free(p);//释放内存
   return 0;
}

好了,关于C语言的动态内存分配先说这么多,下面说一说C++的动态内存分配。
C++的动态内存分配的格式是

int *p = new int; //在堆空间创建int类型变量,new的结果是int*类型,将结果赋值给p
/*c++中在创建堆空间变量时是可以对其进行初始化的,格式为*/
int* p1 = new int(10);//初始化10

同时,C++的动态内存同样需要释放,格式为

delete p;//释放p指向的堆空间的int变量

而在C++中动态分配数组的格式是

int* p = new int[10];//在堆空间创建10个int类型元素的数组

数组的释放格式为

delete[] p;//释放数组必须是delete[]

注: 不加[]编译运行是不会显示什么错误的,但是delete p仅仅释放了p数组的首元素,内存空间并没有释放完全。

最后举一个C++的动态内存分配题目:从键盘输入学生分数int 4 统计出最高分 最低分 平均分 要求:空间动态开辟new

#include 
using namespace std;​​
int main()
{    
	int* p = new int[4];//动态分配四个int内存
	for(int i = 0;i < 4;i++)    
	{        
		cin>>p[i];//输入成绩
	}    
	int max = p[0], min = p[0], sum = p[0];//初始化
	for(int i = 1;i < 4;i++)    
	{        
		if(p[i] > max)        
		{            
			max = p[i];
     	}        
       	else if(p[i] < min)       
       	{            
      		min = p[i];        
        }        
    	sum += p[i];    
    }    
    cout<<"max:"<<max<<"min:"<<min<<"avg:"<<sum/4<<endl;    
    return 0;
}

PS:关于C/C++的动态内存分配就先总结到这,关于C++的相关知识后续会整理出来。如有瑕疵还望评论区指正。Respect !

你可能感兴趣的:(c++,c语言,开发语言)