Top.Mail.Ru
Ответы

Динамическое выделение памяти для двумерных массивов в Си.

Задание звучит так: Дана целочисленная квадратная матрица. Определить: сумму элементов в тех столбцах, которые не содержат отрицательных элементов; минимум среди сумм модулей элементов диагоналей, параллельных побочной диагонали матрицы.

В моем коде я создаю массив из указателей на указатели, то есть матрицу, заполняю её, дальше есть один момент, я создаю массив, чтобы в нем хранить значения суммы побочных диагоналей, и я делаю (тот самый момент)

12
 temp = matrix[i][j];  
diagonals[i+j] += temp; 

Но почему-то при выводе я получаю такой мусор:

Почему?

Когда я свой код прогнал через визуализатор, я увидел, что этот массив diagonals просто не заполняется, почему? я не понимаю..







Мой код:

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
 #include <stdio.h> 
#include <locale.h> 
#include <time.h> 
#include <stdlib.h> 
int main() { 
	setlocale(LC_ALL, "Rus"); 
	int N, ** matrix = NULL; 
	printf("Введите количество строк и столбцов\n"); 
	scanf_s("%d", &N); 
	// Выделение памяти под массив указателей на указатели 
	matrix = (int**) malloc(sizeof(int*) * N); 
	// Если оперативная память не выделит память, программа не крашнется 
	if (matrix != NULL) 
	{ 
		// Выделение памяти под указатели 
		for (int i = 0; i < N; i++) 
			*(matrix + i) = (int*)malloc(sizeof(int) * N); 
		srand(time(NULL)); 
		for (int i = 0; i < N; i++) 
		{ 
			for (int j = 0; j < N; j++) 
			{ 
				matrix[i][j] = rand() % 14 - 4; 
				printf("%d\t", matrix[i][j]); 
			} 
			printf("\n"); 
		} 
		int diag = 2 * N - 1; 
		int *diagonals= NULL; 
		int temp = 0; 
 
		diagonals = (int*)malloc(sizeof(int) * diag); 
			for (int i = 0; i < N; i++) 
			{ 
				for (int j = 0; j < N; j++) 
				{ 
		                        // Тот самый момент 
					temp = matrix[i][j]; 
					diagonals[i+j] += temp; 
			} 
		} 
 
			 
			for (int i = 0; i < diag; i++) { 
				printf("%d\n", *(diagonals+i)); 
		} 
 
	} 
	else 
		printf("Недостаточно памяти..Упс..\n"); 
} 
 
По дате
По рейтингу
Аватар пользователя
Новичок

К вопросу - Массив diagonals не обнулен перед использованием, поэтому в нем мусор.
В си есть выделение памяти с обнулением - calloc вроде.

Аватар пользователя
Искусственный Интеллект

Без инициализации массива там будет все что угодно

PS: Странное использование "диагоналей"
[0+0,1+0|0+1,2+0|1+1|0+2, ... итд

Аватар пользователя
Искусственный Интеллект

У тебя память странновато выделяется как по мне.
Попробуй так:

12
 len = sizeof(int *) * r + sizeof(int) * c * r; 
arr = (int **)malloc(len);