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(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]; } 但这太丑了! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |