关于c++报错:表达式必须含有常量值 的原因及解决办法---动态分配内存

原因:

c++中不允许使用变量作为数组的长度定义数组,必须为常量值,c++中所有的内存需求都是在程序执行前通过定义的常量来确定的。

但是

我们有时候需要在程序运行时才能确定内存需求的变量值,例如所需值是由用户输入的等

比如在下面这个(不完整的)代码中,子函数中定义的二维数组的大小需要由形参frame来确定,frame.rows是一个变量

same2数组的内存大小是由kind决定的,erkind是一个变量(ps:这部分代码中没写出来)

int pixelFlag(cv::Mat &frame,int &num,vector<Point2f> &s,vector<Point2f> &e)//返回个数
{
    //frame.
    int kind=0,kindEnd=0,kindResult=0;//归类类别
    vector<int> same1[2];//可疑边界目标

    int edge[frame.rows][frame.cols];//表明边界属于哪个类
    ......
    ......
    int same2[kind];memset(same2,0,sizeof(same2));
    int sameEnd[kind];memset(sameEnd,0,sizeof(sameEnd));

解决办法:动态分配内存

c++中使用关键字new来进行动态内存申请,它是基于类型进行的,使用关键字delete进行内存释放

1.变量申请 

Type *p=new Type;
...
delete p;
//也可以进行初始化
//例如
int *p=new int(2);//动态分配一个int的空间并初始化为3

2.一维数组申请

Type *p=new Type[n];
...
delete[] p;
//例如

int *p=new int[5];
...
delete[] p;

3.二维数组申请

Type **p=new Type*[m];
//数组p[m][n];
for(int i=0;i<m;++i)
{
    p[i]=new Type[n];
}

 --------更新--------

之前我一直这样创建二维数组,然后使用memset将数组初始化为0,但是总是报错

int **edge = new int*[frame.rows];
for (int k = 0; k < frame.rows; ++k)
{
	edge[k] = new int[frame.cols];
}
memset(edge, 0, sizeof(edge));

做了修改后,这样写就不报错了,暂时还没有搞懂为啥,仅供参考吧,弄清楚之后再更新

int **edge = new int*[frame.rows];
for (int k = 0; k < frame.rows; ++k)
{
	edge[k] = new int[frame.cols];
	memset(edge[k], 0, sizeof(int)*frame.cols);
}

 

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值