尝试运行此代码:
void print_matrix(matrix* arg)
{
int i, j;
for(i = 0; i < arg->rows; i++) {
for(j = 0; j < arg->columns; j++) { // gdb shows, that arg->columns value
printf("\n %f", arg->data[i][j]); // has been changed in this line (was
} // 3, is 0)
printf("\n");
}
}
matrix
是一种结构:typedef struct matrix_t
{
int rows;
int columns;
double** data;
} matrix;
arg正确分配了3x3矩阵,行=3,列=3
函数只打印。
编译器是GCC4.5。
有什么想法吗?
编辑:
int main()
{
matrix arg;
arg.rows = 3;
arg.columns = 3;
arg.data = (double**)malloc(sizeof(double*) * arg.rows);
int i;
for(i = 0; i < arg.rows; i++) {
arg.data[i] = (double*)malloc(sizeof(double) * arg.columns);
}
arg.data[0][0] = 1;
arg.data[0][1] = 2;
//......
print_matrix(&arg);
for(i = 0; i < arg.rows; i++) {
free(arg.data[i]);
}
free(arg.data);
return EXIT_SUCCESS;
}
最佳答案
如上所述,代码似乎没有什么问题。在我的机器和IDEone上编译时工作正常。见http://ideone.com/SoyQH
我还有几分钟时间,所以我多开了几张支票。这些基本上是我在每次代码提交之前或调试时需要一些提示时所采取的步骤。
使用严格的编译器标志进行测试
使用-Wall -pedantic
使用gcc编译时,有一些关于ISO C90不兼容的警告,但没有显示停止符。
[me@home]$ gcc -Wall -pedantic -g k.c
k.c:17:55: warning: C++ style comments are not allowed in ISO C90
k.c:17:55: warning: (this will be reported only once per input file)
k.c: In function `main':
k.c:30: warning: ISO C90 forbids mixed declarations and code
相关警告:
使用C++风格的注释,即
//
而不是/* ... */
在
main()
中,int i;
的声明与代码混合在一起。C90希望所有声明都在开始时完成。使用拆分
在解决上述警告后,对代码运行
splint -weak
。[me@home]$ splint -weak k.c
Splint 3.1.1 --- 15 Jun 2004
Finished checking --- no warnings
没什么要报告的。
瓦尔格林
Valgrind确认没有内存泄漏,但抱怨在
printf
中使用单位化值(并非args->data
中的所有元素都是给定值)。[me@home]$ valgrind ./a.out
==5148== Memcheck, a memory error detector.
... <snip> ...
==5148==
1.000000
2.000000
==5148== Conditional jump or move depends on uninitialised value(s)
==5148== at 0x63D6EC: __printf_fp (in /lib/tls/libc-2.3.4.so)
==5148== by 0x63A6C4: vfprintf (in /lib/tls/libc-2.3.4.so)
==5148== by 0x641DBF: printf (in /lib/tls/libc-2.3.4.so)
==5148== by 0x804842A: print_matrix (k.c:18)
==5148== by 0x8048562: main (k.c:42)
... <snip> ...
==5148==
==5148== ERROR SUMMARY: 135 errors from 15 contexts (suppressed: 12 from 1)
==5148== malloc/free: in use at exit: 0 bytes in 0 blocks.
==5148== malloc/free: 4 allocs, 4 frees, 84 bytes allocated.
==5148== For counts of detected errors, rerun with: -v
==5148== All heap blocks were freed -- no leaks are possible.
结论
没什么要报告的。继续前进。