将char [] []分配给char**

Nic*_*ick 2 c++ arrays

我正在进行一项任务,在这里我们得到一个二维数组,我们需要进行一些计算.

我想将计算的逻辑封装到它自己的类中,所以在我的计算类中,我有成员char**,我试图用给定的char arr [5] [5]初始化.我首先尝试做一个c风格的演员,让它编译,但如果我试图尊重我的成员变量会导致段错误.

简而言之,为什么这不起作用

 class MyClass{
      Myclass(char arr[5][5]){
        m_PmyArr = arr; //doesn't work
     }
     char** m_PmyArr;
 };
Run Code Online (Sandbox Code Playgroud)

为什么这会编译,但会在取消引用时导致段错误

class MyClass{
     Myclass(char arr[5][5]){
        m_PmyArr = (char**)arr; //will compile, but will segfault
     }
     char** m_PmyArr;
 };
Run Code Online (Sandbox Code Playgroud)

我希望这不会被解释为"我的工作对我来说",我真的一直试图更好地掌握指针的细微差别,这与我之前理解数组和指针之间的关系相反

dbu*_*ush 5

A int[5][5]与a不同int**.虽然数组在传递给函数时可以衰减为指针,但这不会发生在多个数组级别.所以两者无法转换.

即使你使指针兼容,你也需要考虑指针的来源.如果它来自局部变量,并且该对象比它创建的函数更长,则指针将变为无效.

您应该动态分配内存:

 class MyClass{
      Myclass(int rows, int cols){
        int i;
        this->rows = rows;
        this->cols = cols;
        m_PmyArr = new int*[rows];
        for (i=0; i<rows; i++) {
            m_PmyArr[i] = new int[cols];
        }
     }
     ~Myclass() {
        int i;
        for (i=0; i<rows; i++) {
            delete[] m_PmyArr[i];
        }
        delete[] m_PmyArr;
     }
     char** m_PmyArr;
     int rows, cols;
 };
Run Code Online (Sandbox Code Playgroud)