c – 使用memset初始化后写入2D阵列时出现访问冲突写入错误
发布时间:2020-12-16 10:08:02 所属栏目:百科 来源:网络整理
导读:我正在使用Visual Studio Community 2017. 以下讨论: Fastest way to zero out a 2d array in C? 我有一个2 D矩阵(10 x 10),我使用memset初始化.这是选项1. 选项2使用两个for循环初始化相同的矩阵,每个循环从0到9循环. 然后,当我写入有效的矩阵位置时,使用
我正在使用Visual Studio Community 2017.
以下讨论: Fastest way to zero out a 2d array in C? 我有一个2 D矩阵(10 x 10),我使用memset初始化.这是选项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,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,您将覆盖内存分配返回的指针,因此,当您稍后访问内存时,实际上是推迟了空指针.
你的2D数组实际上是一个指针数组,因此内存不是连续的,你不能用memset将它设置为0.技术上,它只是一个指针,动态地为另外10个指针分配空间,每个指针指向10个双打. 相反,使用双循环(嵌套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],10 * sizeof(double)); 此外,如果您的数组总是10×10,您可以将其声明为double cmatrix [10] [10]:该内存是连续的,您可以执行原始的memset. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |