第一次成功通话后,Scanf崩溃

时间:2014-06-10 10:01:18

标签: c linux gcc

我写了下面的代码,用于扫描两个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:

欣赏任何建议,可能导致崩溃的原因

2 个答案:

答案 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.但是您的数组只有两个元素01的空间。

int a[3][3], b[3][3];

会解决它