Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

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

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

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

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







Мой код:
 #include  
#include
#include
#include
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");
}
Лучший ответ
Сергей Гений (56253) 1 год назад
К вопросу - Массив diagonals не обнулен перед использованием, поэтому в нем мусор.
В си есть выделение памяти с обнулением - calloc вроде.
RostikPЗнаток (407) 1 год назад
Хаха, действительно сработало! Спасибо!!!!!
RostikP Знаток (407) BorisMolotov, да, это calloc.
Остальные ответы
Jurijus Zaksas Искусственный Интеллект (424878) 1 год назад
У тебя память странновато выделяется как по мне.
Попробуй так:

 len = sizeof(int *) * r + sizeof(int) * c * r; 
arr = (int **)malloc(len);
RostikPЗнаток (407) 1 год назад
разве в выделении памяти дело?
Иван Сигаев Искусственный Интеллект (150170) 1 год назад
Без инициализации массива там будет все что угодно

PS: Странное использование "диагоналей"
[0+0,1+0|0+1,2+0|1+1|0+2, ... итд
СергейГений (56253) 1 год назад
На первый взгляд тривиальный счет - по очереди суммировать каждую диагональ - медленнее работает на больших массивах из за промахов по кешу - каждый раз попадает в другую область памяти.
А такой построчный счет быстрее. И да он похож на распределение гаусса. Ибо в крайних диагоналях только один элемент, а в центре - где главная - там пик.
Иван Сигаев Искусственный Интеллект (150170) Тогда добавь инициализацию массива и abs ( по условию требуется "сумм модулей элементов диагоналей")
Похожие вопросы