【问题标题】:reinterpret_cast<double**> SEG faultreinterpret_cast<double**> SEG 故障
【发布时间】:2013-12-18 11:36:41
【问题描述】:

我正在为多维数组尝试以下代码。它给出了SEG 错误 我不知道这是什么问题。

 static void read(double **arr){
  //REQ arr to be pointing to  array[5][4] 
  //EFF prompt the use to input the data
  //Mod array pointer by **arr
       int i(0) , j(0);
       double tmp ;


       for(i=0 ; i<4 ; i++){

            for(j=0 ; j<5 ; j++) {
                cout <<"Please enter Data#"<<  (j+1) << " File#" << (i+1)  <<" "<<flush;

                cin >> tmp ; 
                arr[j][i] = tmp ;
            }   

        }

        return ; 
    }


int main(){
 double arr[5][4] ;
 read(reinterpret_cast<double**>(arr) ) ;
}

我在这里做错了什么?

【问题讨论】:

  • C 中有 reinterpret_cast 吗?
  • @NishithJainMR 这不是 C。我不知道他为什么使用那个标签。
  • C++ 中的数组未实现为指向指针的指针。它被实现为内存的连续部分。所以arr[2][3]更可能等同于arr + 2*(sizeof(int)*4) + 3*sizeof(int)

标签: c++ multidimensional-array pointers


【解决方案1】:

您正在使用2D array,它的存储方式与线性数组相同(维度仅用于索引),但是您将其解释为pointer to (array of) pointer(s) to (array of) double(s),它具有完全不同的内存布局。请参阅thisthis SO 问题。

【讨论】:

    【解决方案2】:

    数组数组与指向指针的指针相同。

    让我们看看它们在内存中是如何布局的:

    数组数组:

    +-----------+------------+------+-----------+------- --+-----+------------+ | arr[0][0] | arr[0][1] | ... | arr[0][3] | arr[1][0] | ... | arr[4][3] | +-----------+------------+------+-----------+------- --+-----+------------+

    比较指针到指针(例如double** arr):

    +-----+ +--------+--------+------+ | arr | ---> | arr[0] | arr[1] | ... | +-----+ +--------+--------+------+ | | | `-----。 | | v v +-----------+ +------------+ | arr[0][0] | | arr[0][1] | +-----------+ +------------+

    解决方案是更改您的函数,使其采用数组数组:

    void read(double arr[][4]) { ... }
    

    或者一个指向数组的指针(这是因为数组衰减为指针):

    void read(double (*arr)[]) { ... }
    

    那么你可以不强制转换就传递数组:

    double arr[5][4];
    read(arr);
    

    【讨论】:

    • 非常有帮助,非常感谢
    • void read(double (*arr)[]) { ... } 我试过了,但我有编译错误。它不起作用谢谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多