【发布时间】:2018-03-02 15:48:06
【问题描述】:
我正在使用 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要求要填充的内存是一个连续区域,但您有 11 个单独的分配。 -
不要在 C++ 中使用 C 问题的答案。它们是不同的语言;为此使用
memset既没有必要也不是一个好主意。 -
顺便说一句,如果您只想将所有内容设置为零,您应该使用
calloc。话虽如此,在 C++ 中使用malloc/calloc是总是不正确的做法,没有例外。