当作为指向函数的指针传递时,2D数组会被垃圾填满

时间:2011-01-04 10:23:12

标签: c arrays 2d

我在main()函数中声明了这个数组:

int   VISITED[9][9]={{0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0}};

它被传递给一个名为qneighbor的函数

qneighbor (5,5,1, 0, &pawn_positions, &PAWNS, WALLH, WALLV, &VISITED);

qneighbor签名看起来像这样:

CELL* qneighbor( int root_row, int root_col, int p, int dist, struct GameTable* PAWN_POSITIONS, int (*PAWNS)[9][9], int WALLH[8][9], int WALLV[9][8], int (*VISITED)[9][9]){...}

然而,在调试时,我看到在第五行之后,它被传递到qneighbor(在任何命令执行之前)之后立即被垃圾填满。可能出现什么问题?

3 个答案:

答案 0 :(得分:1)

您的代码似乎没有特别的问题 顺便说一下,正如bcsanches所提到的,qneighbor的参数int (*VISITED)[9][9] 是指向int[9][9]的指针 为了访问其元素,VISITED本身必须被称为 (*VISITED)[ i ][ j ]
如果你写VISITED[ i ][ j ],它代表一个指针,而不是一个int 因此,如果您编写printf( "%d", VISITED[i][j] )来确认该值,则会打印出来 指针值(地址)作为int,它看起来像垃圾。

答案 1 :(得分:0)

数组索引超出范围
保持索引< 9

答案 2 :(得分:0)

您不需要使用指针来更改数组,数组是通过引用传递的,因此,请更改为:

CELL* qneighbor( int root_row, int root_col, int p, int dist, struct GameTable* PAWN_POSITIONS, int PAWNS[9][9], int WALLH[8][9], int WALLV[9][8], int VISITED[9][9]){...}

并使用:

调用它
qneighbor (5,5,1, 0, &pawn_positions, PAWNS, WALLH, WALLV, VISITED);

在你的代码中,你实际上正在创建一个指针数组......