【问题标题】:c++ memset cause segment fault of int** pointerc ++ memset导致int**指针的段错误
【发布时间】:2015-06-05 14:55:42
【问题描述】:
    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 也没关系。

我做错了吗? 谢了!

【问题讨论】:

  • 您试图用整数数组填充指针数组,并且超出 (iMatrixWidth + 1) 倍(+/- 指针大小和 int 之间的差异) .
  • 您正在使用 memset 来消除您的 for 循环努力获取的整个指针序列。 (并且为了在伤口上加盐而破坏了过程中的顺序)。
  • 我要问的另一个问题是 +1 的预期目的是什么。为什么不相应地设置 iMetrixHeight?

标签: c++ arrays memset


【解决方案1】:

数组 dpTable[i] 不指向连续内存。然后你必须一个一个地初始化

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

【讨论】:

  • 只要 OP 有任何与现代 C++ 编译器非常相似的东西,dpTable[i] = new int [iMatrixWidth + 1](); 也可以工作。在这种情况下不需要 memset。
  • 哦,是的,我突然想到了
【解决方案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]();
}

看,不是memset——而是要求将内存归零。

这在 C++ 中还是很丑陋的。

所以,这样做:

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

其中vectorstd::vector

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

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

【讨论】:

    猜你喜欢
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 2018-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 2015-09-25
    相关资源
    最近更新 更多