指针·堆内存分配(动态内存)

本文介绍了动态内存分配的概念,对比了C语言中的malloc和free与C++中的new和delete。强调了在编译时无法确定数组大小的情况下,如何在运行时通过堆内存分配来创建数组。同时,文章提到了内存分配失败的判断及处理,以及动态分配内存后手动删除的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、对于普通数组来说,在定义或初始化时必须确定元素个数,即下标必须是已知的,即在编译时已知。

例:定义数组时 int a[6];
      初始化数组时,float a[]={12.3,89.6,-12.56,3.9};
      对数组a来说,虽然没有下标,但是通过{}中的元素个数,可以查出其下标为4。

像这样的格式:
      int a[];                                   错误,下标未知
      int a[n];                                 错误,同上
      int m=10; int a[m];              错误,m是变量,在编译时未知

对于下面格式:
    const int size=50;
    const int  chs=size*sizeof(int);
    int a[size];
    char  s[chs];
    由于size和s是常量,它们在编译时可知,所以格式正确。
    所以常量可以作为下标。

二、通过堆内存分配,可以在定义或初始化时不必确定确定元素个数,即在编译时不知,而在运行时已知。

 1、使用malloc和free

其语法要求:
(1) #include<alloc.h>
(2) 指针名=void* malloc (内存大小);
(3) free(指针名);

说明:
(1)其中的void*为默认类型,表明这个内存空间类型不确定。如果要确定其类型,则必须进行强制类型转换。
(2)内存的大小可以直接写出,也可以通过元素个数乘以sizeof(type)计算。

例1:

#include < iostream.h >
#include
< alloc.h >

void  main()
{
int  arraysize;
int   * array;
cout
<< " 请输入数组个数 " << endl;
cin
<< arraysize;

array
= ( int * )malloc(arraysize * sizeof ( int ));
……
free(array);
}

其中(int*)进行强制类型转换,(arraysize *sizeof(int))计算array堆内存所占的空间量。
free(array)用来释放堆内存。

 2、使用new和delete
其语法要求:

 

动态变量

动态数组

不需要文件头不需要文件头
指针名=new 类型名;指针名 = new 类型名[元素个数];
delete 指针名;delete [ ]指针名;

说明:
(1)不需要头文件
(2)动态数组只需要元素个数,不需要计算其内存空间
(3)malloc定义空间时用(),而new定义空间时用[ ]
(4)对动态变量可以直接初始化,格式为 指针名=new 类型名(初始化值)

例2:

#include < iostream.h >

void  main()
{
int  arraysize;
int   * array;
cout
<< " 请输入数组个数 " << endl;
cin
<< arraysize;

array
= new   int [arraysize];
……
delete [ ]array;
}

 三、分配内存失败

在分配动态内存时,有时候因为内存被占用,可以会分配失败,在这样的情况下,后面的操作是无效的。所以要设定一个判定条件,让内存分配成功时再运行。

内存分配失败的标志是,动态指针的值为NULL,所以可以用if判定。

因此上述两个例子可以改为:

例1改为:

#include < iostream.h >
#include
< alloc.h >

void  main()
{
int  arraysize;
int   * array;
cout
<< " 请输入数组个数 " << endl;
cin
<< arraysize;

if ((array = ( int * )malloc(arraysize * sizeof ( int ))) = NULL)
return ;
else  ……
free(array);
}

例2改为:

#include < iostream.h >

void  main()
{
int  arraysize;
int   * array;
cout
<< " 请输入数组个数 " << endl;
cin
<< arraysize;

if ((array = new   int [arraysize]) = NULL)
return ;
else  ……
delete [ ]array;
}

四、malloc和free是C语言的命令,new和delete是C++的命令,推荐使用后者,因功能更强大。
动态分配内存后,必须手工删除。否则会导致内存溢出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

电脑小玩家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值