Помоги устранить ошибку - C (СИ)
Формулировка задачи:
Есть программа для нахождения обратной матрицы. Я сделал так что бы пользователь вводил размерность этой матрицы и программа выделяла память под массив в зависимости от этой размерности. Видимо на этапе выделения памяти я сделал что то не правильно и компилятор Visual Studio пишет: Unhandled exception at 0x00a03eba in abd.exe: 0xC0000005: Access violation writing location 0xcdcdcdcd. Помогите пожалуйста решить данную проблему. Вот код программы
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_ALL, "Russian");
int nn,i,j;
printf("Введите размерность матрицы:");
scanf("%d", &nn);
float **A=0, **L=0;
A=(float**)malloc(sizeof(float*)*nn);
L=(float**)malloc(sizeof(float)*nn);
for(int i=0; i<nn; i++)
{
A[i]=(float*)malloc(sizeof(float)*nn);
}
for(int i=0; i<nn; i++)
//Поэлементный ввод матрицы:
for (i=0; i<nn; i++)
for (j=0; j<nn; j++)
{ printf("\nЭлемент [%d,%d]: ", i+1, j+1);
float k;
scanf("%f", &k);
A[i][j] = k;
}
//Создание единичной матрицы:
for (i=0; i<nn; i++)
for (j=0; j<nn; j++) if (i!=j) L[i][j]=0; else L[i][j]=1;
j = 0;
int m=0;
int n;
do
{ // Выбор ведущего элемента ниже элемента [j,j-1]:
m = j;
for (n=j+1; n<nn; n++)
if (fabs(A[m][j])<fabs(A[n][j])) m = n;
float prm=0;
//Переобразования над матрицей А:
for (n=0; n<nn; n++)
prm = A[j][j];
for (n=0; n<nn; n++)
{ A[j][n] = float (A[j][n]/prm);
L[j][n] = float (L[j][n]/prm);
}
for (i=0; i<=nn; i++)
if (i!=j)
{ prm = A[i][j];
for (n=j; n<=3; n++) A[i][n] = A[i][n]- float (prm*A[j][n]);
for (n=0; n<=3; n++) L[i][n] = L[i][n]- float (prm*L[j][n]);
}
j++;
}
while (j<nn);
//Вывод на экран обратной матрицы:
printf("\nОбратная матрица:\n");
for (i=0; i<nn; i++)
for (j=0; j<nn; j++)
{ if (j==0) printf("\n"); else printf("\t");
printf("%f", L[i][j]);
}
getch();
**A=0, **L=0,
free(L);
free(A);
return 0;
}Решение задачи: «Помоги устранить ошибку»
textual
Листинг программы
for(int i=0; i<nn; i++)
{
A[i]=(float*)malloc(sizeof(float)*nn);
}
Объяснение кода листинга программы
В данном коде происходит выделение памяти под массив A типа float с помощью функции malloc. При этом, для каждого элемента массива A также выделяется память под один float. После выделения памяти, в неё записывается адрес первого элемента массива A. Список действий:
- Выполняется итерация по числу nn.
- Для каждого значения i происходит выделение памяти под массив A типа float с помощью функции malloc.
- В каждой итерации, в выделенную память записывается адрес первого элемента массива A.