2 qq 26025363 qq_26025363 于 2016.09.20 01:12 提问

C++编译报错,写入内存错误

//changeLength2D
#include
#include
using namespace std;
//template
void changeLength2D(int**& a, int oldrow, int copyrow, int copycoloum, int newrow, int newcoloum)
{
if (copyrow > newrow || copycoloum > newcoloum)
//throw("the array is too small");
;
int**temp = new int*[newrow];
for (int i = 0; i < newrow; i++)
temp[i] = new int [newcoloum];

for (int i = 0; i < copyrow; i++)
{
    copy(a[i], a[i] + copycoloum, temp[i]);
    delete[] a[i];
}
for (int i = copyrow; i < oldrow; i++)
    delete[] a[i];
//delete[] a;
a = temp;

}

int main() {
int a[4][4] = { { 1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16} };
int **b=0;

for (int i = 0; i < 4; i++)
b[i] = &a[i][4];
changeLength2D(b, 4, 2, 2, 4, 4);
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
cout << a[i];
cout << endl;
}

return 0;

}

调试后报错是这样的:引发了异常: 写入访问权限冲突。
b 是 0x1110112。
我检查了好像没有内存越界,数组传参对不对?这个不是很理解的透彻!希望有人解答!谢谢额。这是个改变2维数组的函数。

2个回答

feng1790291543
feng1790291543   Ds   Rxr 2016.09.20 07:20

a被delete之后,没有重新分配内存,直接赋值会出错

qq_26025363
qq_26025363 但是调试的时候是到这步进行不下去了。for (int i = 0; i < 4; i++) b[i] = &a[i][4];还没有运行到函数的这部分,应该是这个数组传参的问题把
大约一年之前 回复
qq_26025363
qq_26025363   2016.09.20 13:30

我调试后,发现我给b分配的内存是没有的,我指向了0,但是如果不写=0,就会报错没有初始化,请问如何能把b指向a的首地址呢,我试过了好几种赋地址,都是错的。这点把我难住了。

leewers
leewers 而且其实a[i][4]已经越界了,由于声明的时候是int a[4][4],那么下标最大也只能是a[3][3],4就已经越界了。其实在循环里直接写b[i] = a[i]就可以了
大约一年之前 回复
leewers
leewers 正确的写法应该是 int ** b = new int*[4]; 随后就可以在循环中正常使用b[i]了。使用完毕后记得delete掉就可以了
大约一年之前 回复
leewers
leewers 首先很明显的一个问题,你没有给b分配内存, int** b;仅仅是声明了b,并没有为其分配内存,而后面的循环中你马上使用了b[i],这个必然是会报错的,因为b[i]并没有内存来存放a[i][4]的地址。
大约一年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片