c++;二维数组索引中存在错误 我正在研究C++程序,问题在下面的代码中。(注意:为了可读性,代码被简化了,但本质仍然存在)。在第一部分中,我只是用一些简单的条件创建一个2D数组 rows= 5/2; cols= 4/2; char** array; if(rows%2 !=0 ){ array = new char*[rows+1]; }else { array = new char*[rows]; } for(int k = 0; k < rows; k++) { if(columns%2 !=0){ array[k] = new char[cols+1]; }else{ array[k] = new char[cols]; } } 行数=5/2; cols=4/2; 字符**数组; 如果(行%2!=0){ 数组=新字符*[行+1]; }否则{ 数组=新字符*[行]; } 对于(int k=0;k

c++;二维数组索引中存在错误 我正在研究C++程序,问题在下面的代码中。(注意:为了可读性,代码被简化了,但本质仍然存在)。在第一部分中,我只是用一些简单的条件创建一个2D数组 rows= 5/2; cols= 4/2; char** array; if(rows%2 !=0 ){ array = new char*[rows+1]; }else { array = new char*[rows]; } for(int k = 0; k < rows; k++) { if(columns%2 !=0){ array[k] = new char[cols+1]; }else{ array[k] = new char[cols]; } } 行数=5/2; cols=4/2; 字符**数组; 如果(行%2!=0){ 数组=新字符*[行+1]; }否则{ 数组=新字符*[行]; } 对于(int k=0;k,c++,arrays,C++,Arrays,到目前为止还不错。代码工作得很好。下一部分是问题所在 for(int k = rows; k<5; k++){ for (int l=0; l< 2; l++){ array[k-rows][l]=Array2[k][l]; } } for(int k=rows;kWithrows=5/2;您将行设置为2。然后分配2行行array=new char*[rows];。但是您可以从2到4进行迭代

到目前为止还不错。代码工作得很好。下一部分是问题所在

  for(int k = rows; k<5; k++){
        for (int l=0; l< 2; l++){
            array[k-rows][l]=Array2[k][l];            
        }
    }

for(int k=rows;kWith
rows=5/2
;您将
行设置为
2
。然后分配2行
array=new char*[rows];
。但是您可以从2到4进行迭代(int k=rows;
Array2
的kd维度是
Array2
的4倍。这不是问题所在。我还用
array[k-rows][l]测试了这一点。)='X'
消除了数组2的任何不确定性,仍然会发生错误。为什么不通过循环查看
k
l
的值是什么,以及
数组[k行]
数组[k行][l]的值是什么
是吗?这将帮助您快速缩小表达式的哪一部分出错,并可能指出原因。
数组[k行]
访问越界。您的数组是2x2,但
k行
接受值
0
1
2
(最后一个越界)。您可能想先检查
%2
,然后再将其除以2。为什么不使用(a)std::vector和(b)一个大小为rows*cols的向量。这将非常简单。我正在分配3个
数组=新字符*[rows+1];
,因为第一段代码中的条件code@john.s或
行=(行+1)/2;列=(列+1)/2;
而不是
if
/
else
,因为两者都是正数。@Gernot1976您这样做的方式是正确的,但是我确实想从2迭代到4,您求解它的方式会从3迭代到4。这会从2迭代到4吗?我想我仍然需要做if-else块,因为我还有其他东西要放在块中
rows= 5/2; // now rows is 2
...
if(rows%2 !=0 ) // 2%2!=0
rows= 5;
cols= 4;

int allocRows = ( rows%2==0 ) ? rows/2 : rows/2+1;
rows=rows/2;

int allocCols = ( cols%2==0 ) ? cols/2 : cols/2+1;
cols=cols/2;

array = new char*[allocRows];
for(int k = 0; k < allocRows; k++)
    array[k] = new char[allocCols];
int origRows = rows; 
rows= 5/2;
...
if(origRows%2 !=0 )
...