我写了下面的代码,用于扫描两个3x3矩阵并打印它们,
#include<stdio.h>
void scanmat(int **arr)
{
int i=0, j=0 ;
for (i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
scanf("%d",((*arr+i)+j));
printf("%d-%d\n",i,j);
}
}
}
void printmat(int **arr)
{
int i=0, j=0 ;
for (i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
printf("%d\n",(*(*arr+i)+j));
}
}
}
void main ()
{
int a[2][2], b[2][2] ;
scanmat (a);
printmat(a);
scanmat(b);
printmat(b);
}
scanmat(a)
和printmat(a)
很好,但当控件达到scanmat(b)
时,我会遇到段错误。
以下是我的系统详情
6_64-redhat-linux
Thread model: posix
gcc version 4.4.6 20120305 (Red Hat 4.4.6-4) (GCC)
在分析核心时,我在下面找到,
Program terminated with signal 11, Segmentation fault.
#0 0x0000003496056470 in _IO_vfscanf_internal () from /lib64/libc.so.6
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.80.el6.x86_64
(gdb) bt
#0 0x0000003496056470 in _IO_vfscanf_internal () from /lib64/libc.so.6
#1 0x0000003496063c6d in __isoc99_scanf () from /lib64/libc.so.6
#2 0x00000000004005d4 in scanmat (arr=0x7fff57041de0) at scanmat.c:10
#3 0x0000000000400842 in main () at scanmat.c:
欣赏任何建议,可能导致崩溃的原因
答案 0 :(得分:3)
你有:
int a[2][2], b[2][2];
因此,您的矩阵只有2x2,因此您会覆盖导致未定义行为的内存。
请记住,在C数组声明中,a[N]
会为您提供一个带有a
元素的数组N
。索引是从0开始的,因此有效索引的范围从0到不包括 N
。迭代这样一个数组的合适方法是
for(size_t i = 0; i < N; ++i)
换句话说,数组N
中元素的数量与您在循环条件中应使用的值完全相同,只要您记得
<
我也不认为您可以将int[2][2]
传递给期望int **
的函数,您确定没有收到这些调用的编译器警告吗?
答案 1 :(得分:1)
int a[2][2], b[2][2] ;
并且,循环
for (i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
0到3表示0,1和2.但是您的数组只有两个元素0
和1
的空间。
int a[3][3], b[3][3];
会解决它