c ++ memset导致int **指针的段错误

c++ memset cause segment fault of int** pointer

    int **dpTable = new int* [iMatrixHeight + 1];
    for (int i = 0; i < iMatrixHeight + 1; i++)
    {
        dpTable[i] = new int [iMatrixWidth + 1];
    }

    memset(dpTable, 0, (sizeof(int)) * (iMatrixHeight + 1)*(iMatrixWidth + 1));

我正在使用 operator new 来分配一个二维数组,但是如果我使用 memset 来初始化数组,当我稍后访问该数组时会出现段错误。没有memset也没关系。

我做错了什么吗? 谢谢!

数组 dpTable[i] 没有指向连续的内存。你必须一个一个地初始化

for (int i = 0; i < iMatrixHeight + 1; i++)
{
    dpTable[i] = new int [iMatrixWidth + 1];
    memset(dpTable[i], 0, (iMatrixWidth + 1) * sizeof(int)) ;
}

代替此代码:

int **dpTable = new int* [iMatrixHeight + 1];
for (int i = 0; i < iMatrixHeight + 1; i++)
{
    dpTable[i] = new int [iMatrixWidth + 1];
}

memset(dpTable, 0, (sizeof(int)) * (iMatrixHeight + 1)*(iMatrixWidth + 1));

……你可以这样做:

int **dpTable = new int* [iMatrixHeight + 1];
for (int i = 0; i < iMatrixHeight + 1; i++)
{
    dpTable[i] = new int [iMatrixWidth + 1]();
}

你看,没有 memset – 而是要求内存归零。

在 C++ 中这仍然很丑陋。

所以,这样做:

vector<vector<int>> table( iMatrixHeight + 1, vector<int>( iMatrixWidth + 1 ) );

其中 vectorstd::vector

或者,考虑定义一个矩阵 class,其中只有一个 vector 作为后备存储。

或者只使用现有矩阵 class,例如来自 Boost.