由于栈的空间不够,我开辟了一块儿动态内存空间,代码如下:GLubyte ***image;//根据需要,开辟一类似多维数组的内存空间
image=new GLubyte**[480];
for(int i=0;i<480;i++)
    image[i]=new GLubyte *[640];
for( i=0;i<480;i++)
    for(int j=0;j<640;j++)
        image[i][j]=new GLubyte[3];glReadBuffer(GL_BACK);
//此处的image应该是一个三维数组,其中存储的信息包括二维像素坐标和RGB
glReadPixels(0,0,640,424,GL_RGB,GL_UNSIGNED_BYTE,image);但总是出现地址访问错误,经检测,新开辟的空间没出错误。
如果用普通的多维数组,如:GLubyte image[424][640][3];
glReadBuffer(GL_BACK);
glReadPixels(0,0,640,424,GL_RGB,GL_UNSIGNED_BYTE,image);则运行正常
请问这是为什么

解决方案 »

  1.   

    好像没问题
    当然,我没有opengl, 不知道glReadPixels()行不行。
      

  2.   

    原因可能是这样:
    现在这样new出来的数组,image+1 = image[1][0][0];
    普通的多维数组, image+1 = image[0][0][1];
    所以出错了。
      

  3.   

    但我用过一维的没有问题
    例:
    double *m_modelview=new double[16];
    glGetDoublev(GL_MODELVIEW_MATRIX,m_modelview);
    double *m_projection=new double[16];
    glGetDoublev(GL_PROJECTION_MATRIX,m_projection);
    int *m_viewport=new int[4];
    glGetIntegerv(GL_VIEWPORT,m_viewport);
    for(int k=0;k<9;k++)
    {
        for(int i=0;i<5;i++)
        {
    gluProject(obj3DCoor[k][i][0],obj3DCoor[k][i][1],obj3DCoor[k][i][2]+translate_z,m_modelview,m_projection,m_viewport,&win2DCoor[frame][k][i][0],
    &win2DCoor[frame][k][i][1],&win2DCoor[frame][k][i][2]);
         }
    }
    delete []m_modelview;
    delete []m_projection;
    delete []m_viewport;
    难道一维和多维有什么不同吗
    开辟动态空间实际就是定义指针,指针不也是按照首地址进行计算的吗
      

  4.   

    一维的不管怎么用,计算数组中的某个元素的地址,image+n指向都是唯一的。
    多维数组,就要看分配地址的顺序了。
      

  5.   

    image=new GLubyte**[480]; --> image=new GLubyte**[424];  //???
      

  6.   

    打个比方:
    在栈申请了一个20*10的char数组,假设地址是Addr
    char test[10][20];
    那么test[0][5]这个元素的地址就是 Addr + 0 * 20 + 5 = Addr + 5,这也是C++编译器对多维数组的翻译方法;但是如果按照new 的方法来申请 test = new *char[10];  假设首地址还是Addr
    那么Addr + 5这个位置就应该是test[5];
    而编译器依然按照多维数组的方式翻译test[0][5],就会跑到test[5]的位置去;因此,最后new得到的空间虽然大小跟直接使用多维数组的一样,但是存储顺序已大相径庭,
    将image指针传递过去自然也就出错了,这个要解决就得手动操作了,唉,太复杂,还是等高手吧~
      

  7.   

    大体上明白了new空间存储地址的方式
    我做了一个实验
    ***(image+1)=image[1][0][0];
    **(*image+1)=image[0][1][0];
    *(**image+1)=image[0][0][0];
    但从首地址image到地址**image是怎样的一个过程
    即它的内部是怎样存储数据的
    敬候高手解答!!
      

  8.   

    另外测了一下 ,连续new出来的空间也不是连续的,操作系统有算法控制。这里的地址访问错误直接原因应该是这个。但就算不越界,里面存储的数据也不是你想要的image到**image就是指针的问题了吧,image的值是第一次new返回的空间首地址,*image就是这个首地址里面的数据(),而这个32位数也是一个地址,是第二次new返回的空间首地址,所以就有了**image...以此类推~
      

  9.   

    是否可以用下面的方法:
    new GLubyte[640*480*3]
    然后访问的时候就直接按照正常的多维数组的访问方法来访问。