首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

双重指针有关问题

2012-04-18 
双重指针问题#include stdafx.h#includeMyMatrix.husing namespace stdint _tmain(int argc, _TCHAR*

双重指针问题
#include "stdafx.h"
#include"MyMatrix.h"
using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{
double **R;
R=new double *[3];
for(int i=0;i<3;i++)
{
R[i]=new double[4];
}
for(int j=0;j<3;j++)
{
for(int k=0;k<4;k++)
{
*(*(R+j)+k)=j+k;
}
}
CMatrix mat1(3,4,*R);
for(int j=0;j<3;j++)
{
for(int k=0;k<4;k++)
{
cout<<"R["<<j<<"]["<<k<<"]="<<R[j][k]<<"\t"<<mat1.GetElement (j,k)<<"\t"<<*(*(R+j)+k)<<"\n";
}
}
return 0;
}
这段代码的结果为什么是
R[0][0]=0 0 0
R[0][1]=1 1 1
R[0][2]=2 2 2
R[0][3]=3 3 3
R[1][0]=1 -1.45682e+144 1
R[1][1]=2 7.36522e-251 2
R[1][2]=3 1.70021e-307 3
R[1][3]=4 0 4
R[2][0]=2 2.122e-314 2
R[2][1]=3 -7.84591e+298 3
R[2][2]=4 1 4
R[2][3]=5 2 5

[解决办法]
链接数组不同于普通数组,不可以用R[j][k]这样的方式去访问。正确的方式应该是(R[j])[k]。

此外,你把一个double*[]型实参传递给了double[]型的形参,怎么系统没提示出错?

其实,这么小的二维数组,你何必用链接数组的形式呢?
[解决办法]
呃,CMatrix mat1(3,4,*R)里的*R不应该认为是double*[],确实是double[]了。不过,你只把R[0]给传过去了,没能传递整个数组。
[解决办法]
这句 memcpy(m_pData, value, sizeof(double)*m_nNumColumns*m_nNumRows); 是 undefined behavior,复制了状态不确定的内存。原因在于,value 所指向的内存只包含 m_nNumColumns 个有定义的元素,后者是因为 R 数组行与行之间地址不连续造成的。

热点排行