为什么printf(创建单位矩阵)不打印输出?

时间:2018-12-01 08:10:14

标签: c matrix printf output

我不知道是什么问题。作为命令行参数,我尝试输入的是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 :(得分:1)

identity_matrix中,您的循环索引是错误的:

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

应该是

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

因此它会溢出内存,并且您会得到未定义的行为

请注意,我没有发现,您的代码看起来还不错。我首先在调试和启用所有警告的情况下对其进行了编译

$ gcc -g -Wall test.c

没有警告,好的,所以我只是debugged your program,使用命令行:

$ 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)

要么我更幸运,要么内存配置不同,但是程序在错误发生的地方崩溃了。