Почему printf (создание идентификационной матрицы) не печатает вывод? - PullRequest
0 голосов
/ 01 декабря 2018

Я не могу понять, в чем проблема.Введенный мною ввод в качестве параметра командной строки равен 3, и вместо матрицы идентичности 3x3 я получаю только это:

Процесс вернул -1073741819 (0xC0000005) время выполнения: 1,545 с

Нажмите любую клавишу для продолжения.

Я пробовал несколько вещей, которые я прочитал здесь, чтобы исправить это, например, "fflush (stdout);"и "fprintf (stderr," ... "), но ни один из них не сработал.

Мой код:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

typedef struct matrix
{
    int N;
    double *m;
}   matrix_t;

void alloc_matrix(matrix_t* mat)
{
    mat->m = malloc(mat->N * mat->N * sizeof(double));
}

void print_matrix(matrix_t mat)
{
    printf("Test:\n" );
    for(int i = 0; i < mat.N; i++)
    {
        for(int j = 0; j < mat.N; j++)
        {
            printf("%lf ",mat.m[i * mat.N +j]);
        }
        printf("\n");
    }
}

void identity_matrix(matrix_t mat)
{
    int i, j;
    for(i = 0; i < mat.N; i++)
    {
        for (j = 0; i < mat.N; j++)
        {
            if(i == j)
            {
                mat.m[i * mat.N + j] = 1;
            } else {
                mat.m[i * mat.N + j] = 0;
            }
        }
    }
}

int main(int argc, char* argv[])
{
    int N = atoi(argv[1]);

    matrix_t inverse;
    inverse.N = N;

    alloc_matrix(&inverse);
    identity_matrix(inverse);
    print_matrix(inverse);


    return 0;
}

1 Ответ

0 голосов
/ 01 декабря 2018

in identity_matrix Ваш индекс цикла неверен:

   for (j = 0; i < mat.N; j++)

должен быть

for (j = 0; j < mat.N; j++)

, поэтому он переполняет память, и вы получаете неопределенное поведение

Обратите внимание, что я не обнаружил, что ваш код выглядел хорошо.Сначала я скомпилировал его с включенной отладкой и всеми предупреждениями

$ gcc -g -Wall test.c

Никаких предупреждений, хорошо, поэтому я просто отладил вашу программу , используя командную строку:

$ gdb a
blah blah blah ....
Reading symbols from a...done.
(gdb) r 3
Starting program: L:\so\a.exe 3
[New Thread 7364.0x68c]

Program received signal SIGSEGV, Segmentation fault.
0x0000000000401686 in identity_matrix (mat=...) at test.c:40
40                      mat.m[i * mat.N + j] = 0;
(gdb) p mat
$1 = {N = 3, m = 0x3928b0}
(gdb) p i*mat.N + j
$2 = 1770
(gdb)

Либо мне повезло, либо конфигурация памяти была другой, но программа вылетала там, где была ошибка.

...