Динамическое выделение памяти для двумерных массивов в Си.
Задание звучит так: Дана целочисленная квадратная матрица. Определить: сумму элементов в тех столбцах, которые не содержат отрицательных элементов; минимум среди сумм модулей элементов диагоналей, параллельных побочной диагонали матрицы.
В моем коде я создаю массив из указателей на указатели, то есть матрицу, заполняю её, дальше есть один момент, я создаю массив, чтобы в нем хранить значения суммы побочных диагоналей, и я делаю (тот самый момент)
temp = matrix[i][j];
diagonals[i+j] += temp;
Но почему-то при выводе я получаю такой мусор:

Почему?
Когда я свой код прогнал через визуализатор, я увидел, что этот массив diagonals просто не заполняется, почему? я не понимаю..
Мой код:
#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, ... итд

У тебя память странновато выделяется как по мне.
Попробуй так:
len = sizeof(int *) * r + sizeof(int) * c * r;
arr = (int **)malloc(len);