массивы — Магический квадрат в переполнении стека

Еще одна проблема магического квадрата. Я создаю нечетную магическую программу на 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";
}
}

Что с этим не так? Правильно ли я объявляю мои указатели?

2

Решение

Вы создаете массив указателей:

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* чтобы избавить вызывающего абонента от хлопот и удаления указателя.

2

Другие решения

Вы только частично создаете экземпляр матрицы. У тебя есть int **matrix = new int *[n] который даст вам ваши строки, но вы определяете столбцы. Для полной инициализации вам необходимо использовать

int **matrix = new int *[n];
for (int i = 0; i < col_dimension; i++)
matrix[i] = new int[col_dimension];
1

Вы разыменовываете нулевые указатели. У вас есть 2-й массив:

int **matrix = new int *[n];

Что вам ясно (неправильно — размер должен быть n * sizeof(*matrix)):

memset(matrix, 0, sizeof(matrix[0][0]) * square);

А затем сразу же напишите в:

for (int i = 1; i <= square; i++) {
matrix[row][col] = i;
....
}

Но matrix[0] является NULL, Вы должны сначала выделить все указатели!

for (int i = 0; i < n; ++i) {
matrix[i] = new int[whatever];
}
1
По вопросам рекламы [email protected]