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 ) );
其中vector
是std::vector
。
或者,考虑定义一个矩阵类,其中只有一个 vector
作为后备存储。
或者只使用现有的矩阵类,例如来自 Boost。
【讨论】:
以上是关于c ++ memset导致int**指针的段错误的主要内容,如果未能解决你的问题,请参考以下文章