C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 使用memset而不是for循环初始化int **时出现分段错误大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
这是我在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循环,如下所示:

@H_374_7@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];
}

但这太丑了!

大佬总结

以上是大佬教程为你收集整理的c – 使用memset而不是for循环初始化int **时出现分段错误全部内容,希望文章能够帮你解决c – 使用memset而不是for循环初始化int **时出现分段错误所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。