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

原因:

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

但是

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

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

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

int pixelFlag(cv::Mat &frame,int &num,vector &s,vector &e)//返回个数
{
    //frame.
    int kind=0,kindEnd=0,kindResult=0;//归类类别
    vector 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

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

之前我一直这样创建二维数组,然后使用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);
}

 

你可能感兴趣的:(c++)