大佬教程收集整理的这篇文章主要介绍了c – 使用memset而不是for循环初始化int **时出现分段错误,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
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,请注明来意。