加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读