作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
又一个幻方问题。我正在用 C++ 创建一个奇怪的魔方程序,由于某种原因,该程序不断出现段错误并退出。这是代码:
#include <iostream>
using std::cin;
using std::cout;
#include <cstring>
using std::memset;
int *generateOddSquare(int n) {
if (n % 2 != 0 && n >= 3) {
int row = 0, col = n / 2, square = n * n;
int **matrix = new int *[n], *dest = new int[square];
memset(matrix, 0, sizeof(matrix[0][0]) * square);
for (int i = 1; i <= square; i++) {
matrix[row][col] = i;
if (i % n == 0)
row++;
else {
if (row == 0)
row = n - 1;
else
row--;
if (col == (n - 1))
col = 0;
else
col++;
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
dest[(i * n) + j] = matrix[i][j];
}
}
return dest;
} else
return NULL;
}
int main() {
int *arr = generateOddSquare(3);
for (int i = 0; i < 9; i++) {
cout << arr[i] << "\n";
}
}
它有什么问题?我声明指针的方式是否正确?
最佳答案
你创建了一个指针数组:
int **matrix = new int *[n]
但不要将它们初始化为指向任何东西;因此,当您尝试取消引用它们时会出现段错误。如果您真的必须兼顾指针,则为每个指针分配一个数组以指向:
for (int i = 0; i < n; ++i) {
matrix[i] = new int[n];
}
如果您关心内存泄漏,请不要忘记删除所有这些分配。
除非这是受虐狂的练习,否则使用标准库会让生活更轻松:
std::vector<std::vector<int>> matrix(n, std::vector<int>(n));
并返回std::vector<int>
而不是 int*
为调用者省去了处理和删除指针的麻烦。
关于c++ - C++ 中的幻方,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29631245/
我正在一个 nodejs 服务器上工作,它将发布的 html 呈现为 pdf、png 或 jpg。( https://github.com/svenhornberg/pagetox (server.j
我是一名优秀的程序员,十分优秀!