不懂
- C/C++ code
#include <iostream>using namespace std;double **p;int Row,Col;void _copy(double **b,int row,int col){ Row=row; Col=col; p=new double *[row]; for(int i=0;i<row;++i) { p[i]=new double[col]; for(int j=0;j<col;++j) { p[i][j]=*(*(b+i)+j); } }}void del(){ for(int i=0;i<Row;++i) { delete [] p[i]; } delete [] p;}int main(){ double a[2][3]= { {1,2,3}, {2,2,1} }; _copy((double **)a,2,3); del();}这段代码会弹出“.exe 中的 0x00f8158e 处有未经处理的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突”
- C/C++ code
#include <iostream>using namespace std;double **p;int Row,Col;void _copy(double *b,int row,int col){ Row=row; Col=col; p=new double *[row]; for(int i=0;i<row;++i) { p[i]=new double[col]; for(int j=0;j<col;++j) { p[i][j]=b[i*row+j]; } }}void del(){ for(int i=0;i<Row;++i) { delete [] p[i]; } delete [] p;}int main(){ double a[2][3]= { {1,2,3}, {2,2,1} }; _copy((double *)a,2,3); del();}而这样就可以,为什么?
[解决办法]
当你把b强制转换为double**时,就已经丢失了所有维的长度信息,所以当你之后计算(b+i)时,并不能跳转到你想要的位置
[解决办法]
[解决办法]
[解决办法]
因为类型不匹配,转换可能会出现不可预料的结果.
double a[2][3]的类型是 double(*)[3];
转换为double **一般会出问题.
因为 double a[2][3]一般在内存中的存储是线性的.也就是说
一个长为 sizeof(double)*2*3的线性连续空间.
而double**假设是 锯齿数组那样的 多个连续空间,二者多个连续空间之间不一定是连续的.
所以,悲剧发生了
[解决办法]
数组与指针是两回事,任意维数的数组都是一级指针,不要试图将多维数组直接赋值给多级指针,也不要将多级指针复制给多维数组,因为它们不匹配。
可参考我在下面地址的回帖
http://topic.csdn.net/u/20091123/11/0c03d2e2-0655-4634-8287-0e2315d889fc_13.html
[解决办法]
二维数组退化之后也不可能转化为二级指针。