gpt4 book ai didi

c++ - 使用 memset 初始化后写入二维数组时出现访问冲突写入错误

转载 作者:太空狗 更新时间:2023-10-29 20:09:27 24 4
gpt4 key购买 nike

我正在使用 Visual Studio Community 2017。

在下面的讨论之后:

Fastest way to zero out a 2d array in C?

我有一个使用 memset 初始化的二维矩阵 (10 x 10)。这是选项 1。

选项 2 使用两个 for 循环初始化同一个矩阵,每个循环从 0 到 9。

然后,当我写入有效的矩阵位置时,使用选项 1 时会抛出访问冲突写入错误。使用选项 2 时一切正常。

我拥有的复制此内容的最小工作代码如下:

#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <iostream>
#include <sstream>
#include <fstream>
#include <iomanip>
#include <stdlib.h>
#include <math.h>
#include <cmath>
#include <vector>
#include <string>
#include <limits.h>
#include <stdlib.h>
#include <array>



int main(){
double ** cmatrix = new double*[10];
for (int i = 0; i < 10; i++)
cmatrix[i] = new double[10];

memset(cmatrix, 0, 10 * 10 * sizeof(double));//Option 1

//for (int i = 0; i < 10; i++)//Option 2
//for (int j = 0; j < 10; j++)
//cmatrix[i][j] = 0;

cmatrix[0][1] = 5;//This step produces error on Option 1, but not on option 2

return 0;
}

感谢任何帮助。

最佳答案

使用 memset,您将覆盖内存分配返回的指针,因此当您稍后访问内存时,您实际上是在延迟一个空指针。

您的二维数组实际上是一个指针数组,因此内存不是连续的,您不能执行 memset 将其设置为 0。从技术上讲,它只是一个指针,您可以动态地为其分配空间另外 10 个指针,每个指针指向 10 个 double 。

相反,使用双循环 (nested-fors) 来初始化它,或者每行只使用一个 memset:

for (int i = 0; i < 10; ++i)
for (int j = 0; j < 10; ++j)
cmatrix[i][j] = 0.0;

// or

for (int i = 0; i < 10; ++i)
memset(cmatrix[i], 0, 10 * sizeof(double));

此外,如果您的数组始终为 10x10,您可以将其声明为 double cmatrix[10][10]:内存是连续的,您可以执行原始的 memset.

关于c++ - 使用 memset 初始化后写入二维数组时出现访问冲突写入错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46341427/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com