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

Posted

技术标签:

【中文标题】c ++ memset导致int**指针的段错误【英文标题】:c++ memset cause segment fault of int** pointer 【发布时间】: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? Initialize a double pointer with zeros in C++的可能重复 【参考方案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。

【讨论】:

以上是关于c ++ memset导致int**指针的段错误的主要内容,如果未能解决你的问题,请参考以下文章

64位平台上,函数返回指针时遇到的段错误问题

嵌入式常见的段错误死机原因之一strlen函数

嵌入式常见的段错误死机原因之一strlen函数

嵌入式常见的段错误死机原因之一strlen函数

使用 std::string.c_str() 作为另一个方法的参数时的段错误

将一个指针分配给另一个时的段错误