读书人

不懂,该如何处理

发布时间: 2012-04-14 17:14:21 作者: rapoo

不懂

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)时,并不能跳转到你想要的位置
[解决办法]
探讨

当你把b强制转换为double**时,就已经丢失了所有维的长度信息,所以当你之后计算(b+i)时,并不能跳转到你想要的位置

[解决办法]
探讨
引用:

当你把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
[解决办法]
二维数组退化之后也不可能转化为二级指针。

读书人网 >C++

热点推荐