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

时间:2015-06-05 14:55:42

标签: c++ arrays memset

    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,没关系。

我做错了吗? THX!

2 个答案:

答案 0 :(得分:5)

数组dpTable [i]不指向连续的内存。你必须逐个初始化

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

答案 1 :(得分:2)

而不是这段代码:

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]();
}

看看ma,没有memset - 而是要求将内存归零。

在C ++中仍然非常难看。

所以,这样做:

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

其中vectorstd::vector

或者,考虑使用一个vector作为后备存储来定义矩阵类。

或者只使用现有的矩阵类,例如来自Boost。