查看: 82|回复: 0

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

[复制链接]

412

主题

73

听众

3866

积分

Rank: 12Rank: 12Rank: 12

发表于 2019-10-24 16:31 |显示全部楼层
共享资源获取更多积分!share your resources get more credits!
原因:
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技术讨论”版块中发帖,便于集中解决!
您需要登录后才可以回帖 登录 | 立即注册

懒人模式:

关闭

站长推荐 上一条 /1 下一条

Unity3D游戏开发联盟(资源共享平台) -Unity3D,Unreal ( 苏ICP备12051100号 )   

GMT+8, 2019-11-22 16:52 , Processed in 0.106057 second(s), 44 queries .