找回密码
 立即注册
查看: 1485|回复: 0

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

[复制链接]
发表于 2019-10-24 16:31 | 显示全部楼层 |阅读模式
原因:
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=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);
}

————————————————
版权声明:本文为CSDN博主「不尽木」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42638401/article/details/88957796

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-22 11:11 , Processed in 0.091154 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表