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 ) );
其中 vector
是 std::vector
。
或者,考虑定义一个矩阵 class,其中只有一个 vector
作为后备存储。
或者只使用现有矩阵 class,例如来自 Boost.
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 ) );
其中 vector
是 std::vector
。
或者,考虑定义一个矩阵 class,其中只有一个 vector
作为后备存储。
或者只使用现有矩阵 class,例如来自 Boost.