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

c – 使用memset而不是for循环初始化int **时出现分段错误

发布时间:2020-12-16 09:43:23 所属栏目:百科 来源:网络整理
导读:这是我在c中的代码 int** a;try{ a = new int*[m]; for(int i = 0; im;i++) a[i] = new int[n];} … 现在我正在使用for循环初始化上面的内容,如下所示: for(int i = 0; im; i++) for(int j = 0; in; j++) a[i][j] = 0; 我正在努力提高性能,因此使用memset的
这是我在c中的代码

int** a;
try{
  a = new int*[m];
  for(int i = 0; i<m;i++)
    a[i] = new int[n];
}


现在我正在使用for循环初始化上面的内容,如下所示:

for(int i = 0; i<m; i++)
  for(int j = 0; i<n; j++)
      a[i][j] = 0;

我正在努力提高性能,因此使用memset的想法是个好主意.所以修改我的代码使用memset而不是for循环,如下所示:

memset(a,sizeof(a[0][0]) * m * n);

但是我在执行此操作时遇到Segmentation错误.任何人都可以帮我弄清楚我做错了什么?

解决方法

int** a;

这只是给你一个对象.一个int **对象.它根本不指向任何地方.没有要分配的整数.当您开始分配int时,就好像它们存在一样,您会得到未定义的行为.

另外,指向int的“2d数组”的int **的内存布局是这样的:int **指向int * s数组中的第一个元素,int * s指向第一个元素整数数组中的元素.这个内存不是连续的,因为它需要间接跳转内存,即它不是单个内存块.你不能只使用memset写它.

如果您只想要一个固定的编译时大小的整数二维数组,请执行以下操作:

int a[N][M];

其中N和M是常量表达式.这是连续存储的,但我仍然不建议使用memset.

或使用标准容器,例如:

std::array<std::array<int,M>,N> a;

如果您需要动态大小,请尝试:

std::vector<std::vector<int>> a(M,std::vector<int>(N));

或者,您可以坚持使用int **并确保动态分配int * s和ints:

int** a = new int*[M];
for (i = 0; i < N; i++) {
  a[i] = new int[N];
}

但这太丑了!

(编辑:李大同)

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

    推荐文章
      热点阅读