我不知道是什么问题。作为命令行参数,我尝试输入的是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;
}
答案 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)
要么我更幸运,要么内存配置不同,但是程序在错误发生的地方崩溃了。