我正在进行一项任务,在这里我们得到一个二维数组,我们需要进行一些计算.
我想将计算的逻辑封装到它自己的类中,所以在我的计算类中,我有成员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)
我希望这不会被解释为"我的工作对我来说",我真的一直试图更好地掌握指针的细微差别,这与我之前理解数组和指针之间的关系相反
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)