我编码的一个简单函数出现分段错误
Segmentation fault error occurs for a simple function I have coded
这里我只想定义一个函数,它返回矩阵的乘积,如果N
是任意的,我想用new
命令生成一个矩阵。当我执行功能时,我得到错误:
Segmentation fault (core dumped)
每当我为C
赋值时,我都会出现这个错误,有人能告诉我发生了什么以及如何修复吗?
int **multiply(int **A, int **B, int N){
int **C = new int*[N];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
for (int k = 0; k < N; k++)
C[i][j] = C[i][j] + A[i][k] * B[k][j];
}
}
return (C);
}
将矩阵作为指针的指针不是一个好主意。要做到这一点,你需要一个相当复杂的:
int **C = new int*[N];
for(int i = 0; i < N; ++ i)
C[i] = new int[M];
释放这一点也是一个同样复杂的过程。还要想一想,如果其中一个operator new
失败,并且您想要释放部分分配的矩阵,会发生什么。
将2D阵列存储在1D阵列中是一种惯例。你可以做:
int *C = new int[M * N];
然后元素被访问为:
C_ij = C[i + N * j];
或作为:
C_ij = C[j + M * i];
其中i
在[0, N)
区间,j
在[0 to M)
区间。这些实际上与编译器生成对恒定大小的2D数组的访问的方式非常相似(因此乘法实际上并不太昂贵,而且在考虑缓存时,整个过程可能比数组的数组快得多(。上面两行的区别在于,一行是列主行(当展开到1D时,列的元素是连续的项目(或交替的行主行。这是惯例问题。默认的"C"数组将是行主数组。一些库,如OpenGL或Eigen,使用列专业。
int **C=new int*[N];
这为指针数组腾出了空间。它不会初始化它们,所以它们可以指向任何地方。它们甚至可能是NULL指针。
C[i][j]
这可能会导致空指针取消引用。这可能就是造成分割错误的原因。
正如guest所指出的,C中的指针还没有初始化。您需要在第一个循环中初始化它们(注释1(,并在第二个循环中将它们的元素初始化为零(注释2(:int **multiply(int **A, int **B, int N){
int **C = new int*[N];
for (int i = 0; i < N; i++) {
C[i] = new int[N]; //1
for (int j = 0; j < N; j++) {
C[i][j] = 0; //2
for (int k = 0; k < N; k++)
C[i][j] = C[i][j] + A[i][k] * B[k][j];
}
}
return (C);
}
相关文章:
- 关于简单C++函数(is_palindrome)的逻辑的问题
- 关于 c++ 函数中指针赋值的简单问题
- 从函数返回任意简单类型的数据
- 如何在没有函数的情况下编写此代码并使C++更简单?
- 用于在 C++ 中使用 while 循环查找下一个素数的简单函数
- 查找定义我的 C/C++ 函数/宏的文件比'grep'更简单的方法
- 处理简单 cpp 类构造函数中的错误
- 尝试创建包含简单方程的函数
- 简单函数并不总是返回预期的输出
- 有没有一种简单的方法可以在对象向量上调用构造函数?
- 有没有一种简单的方法来调用带有默认参数的函数?
- "std::function"的简单版本:函数对象的生存期?
- C++简单函数困境
- Qt的新信号/时隙语法问题 - 连接到一个简单的函数
- 为具有多个参数的函数创建 SWIG 类型图的更简单方法?
- 这个简单的 C++ 递归函数来反转字符串有什么问题?
- 返回值的简单模板类成员函数专用化
- 在简单地移动参数时使用函数模板参数的优点
- 迭代器和简单的赋值/析构函数
- 如何使用这个 C++ 模板函数.简单的初学者问题