user-0 提问: 八皇后问题中出现的一个bug，传值调用后实参发生了变化？？？！！求解

回复:
user: user-1
content: “多一少一”问题占程序员常犯错误的10%以上！ 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断，掰手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个？ <、<=、==、>、>=中的哪个？

user: user-1
content: 仅供参考：#include <stdio.h> int d[8][8]; int n; void queen8(int L) {     int x,y;      if (8==L) {         n++;         printf("%d\n",n);         for (y=0;y<8;y++) {             for (x=0;x<8;x++) { //              printf("%d",d[y][x]);                 if (d[y][x]) printf("■");                 else         printf("□");             }             printf("\n");         }         return;     }     for (x=0;x<8;x++) {         for (y=0;y<L;y++) {             if  (              d[y][x      ]              || (x-(L-y)>=0 && d[y][x-(L-y)])              || (x+(L-y)< 8 && d[y][x+(L-y)]))                 break;         }         if (y>=L) {             d[L][x]=1;             queen8(L+1);             d[L][x]=0;         }     } } int main() {     int y,x;     for (y=0;y<8;y++) {         for (x=0;x<8;x++) {             d[y][x]=0;         }     }     queen8(0);     return 0; }

user: user-2
content: i一点也不是随机值啊，就是最高字节变1，显然是越界设出来的

user: user-3
content: 八皇后问题，定义的二维数组是8行8列，那么处理函数里看，是越界了。因为下标只能从0~7

user: user-4
content: 引用 2 楼 Chancy_cx 的回复:square定义的是[8][8]的数组  void Changeflag(Board* board, int iQueen, int jQueen,bool flg) { 	int i = iQueen, j = 1; 	while (i >= 1 && i <= 8 && j >= 1 && j <= 8) 	{ 		board->square[i][j].flag = flg; 		j++; 	}  	i = 1, j = jQueen; 	while (i >= 1 && i <= 8 && j >= 1 && j <= 8) 	{ 		board->square[i][j].flag = flg; 		i++; 	}  	i = iQueen + 1, j = jQueen + 1; 	while (i >= 1 && i <= 8 && j >= 1 && j <= 8) 	{ 		board->square[i][j].flag = flg; 		i++, j++; 	}  	i = iQueen - 1, j = jQueen - 1; 	while (i >= 1 && i <= 8 && j >= 1 && j <= 8) 	{ 		board->square[i][j].flag = flg; 		i--, j--; 	}  	i = iQueen + 1, j = jQueen - 1; 	while (i >= 1 && i <= 8 && j >= 1 && j <= 8) 	{ 		board->square[i][j].flag = flg; 		i++, j--; 	}  	i = iQueen - 1, j = jQueen + 1; 	while (i >= 1 && i <= 8 && j >= 1 && j <= 8) 	{ 		board->square[i][j].flag = flg; 		i--, j++; 	} }  大佬 能帮忙看下吗  已经非常明显了啊，你定义的 [8][8] 的数组，下标最大应该是 7 你里面访问到 8 了 数组下标是从 0 开始的， 不是 1

user: user-3
content: 引用 7 楼 Chancy_cx 的回复:[quote=引用 5 楼 cfjtaishan 的回复:] 在调用Changeflag之前，先看一下i的值是多少。这儿怀疑i是一个随机值。 544494427我的qq[/quote] 这个问题，你查看调用之前i的值了吗？

user: user-0
content: 引用 5 楼 cfjtaishan 的回复:在调用Changeflag之前，先看一下i的值是多少。这儿怀疑i是一个随机值。 544494427我的qq

user: user-0
content: 引用 5 楼 cfjtaishan 的回复:在调用Changeflag之前，先看一下i的值是多少。这儿怀疑i是一个随机值。 大佬 方便加个微信或者qq聊吗，现在很头疼这个问题

user: user-3
content: 在调用Changeflag之前，先看一下i的值是多少。这儿怀疑i是一个随机值。

user: user-3
content: 引用 2 楼 Chancy_cx 的回复:square定义的是[8][8]的数组  void Changeflag(Board* board, int iQueen, int jQueen,bool flg) { 	int i = iQueen, j = 1; 	while (i >= 1 && i <= 8 && j >= 1 && j <= 8) 	{ 		board->square[i][j].flag = flg; 		j++; 	}  	i = 1, j = jQueen; 	while (i >= 1 && i <= 8 && j >= 1 && j <= 8) 	{ 		board->square[i][j].flag = flg; 		i++; 	}  	i = iQueen + 1, j = jQueen + 1; 	while (i >= 1 && i <= 8 && j >= 1 && j <= 8) 	{ 		board->square[i][j].flag = flg; 		i++, j++; 	}  	i = iQueen - 1, j = jQueen - 1; 	while (i >= 1 && i <= 8 && j >= 1 && j <= 8) 	{ 		board->square[i][j].flag = flg; 		i--, j--; 	}  	i = iQueen + 1, j = jQueen - 1; 	while (i >= 1 && i <= 8 && j >= 1 && j <= 8) 	{ 		board->square[i][j].flag = flg; 		i++, j--; 	}  	i = iQueen - 1, j = jQueen + 1; 	while (i >= 1 && i <= 8 && j >= 1 && j <= 8) 	{ 		board->square[i][j].flag = flg; 		i--, j++; 	} }  大佬 能帮忙看下吗 在调用这个函数之前，建议你先打印一下i,j，这儿怀疑变量i是一个随机值。

user: user-0
content: @user-4

user: user-0
content: square定义的是[8][8]的数组  void Changeflag(Board* board, int iQueen, int jQueen,bool flg) { 	int i = iQueen, j = 1; 	while (i >= 1 && i <= 8 && j >= 1 && j <= 8) 	{ 		board->square[i][j].flag = flg; 		j++; 	}  	i = 1, j = jQueen; 	while (i >= 1 && i <= 8 && j >= 1 && j <= 8) 	{ 		board->square[i][j].flag = flg; 		i++; 	}  	i = iQueen + 1, j = jQueen + 1; 	while (i >= 1 && i <= 8 && j >= 1 && j <= 8) 	{ 		board->square[i][j].flag = flg; 		i++, j++; 	}  	i = iQueen - 1, j = jQueen - 1; 	while (i >= 1 && i <= 8 && j >= 1 && j <= 8) 	{ 		board->square[i][j].flag = flg; 		i--, j--; 	}  	i = iQueen + 1, j = jQueen - 1; 	while (i >= 1 && i <= 8 && j >= 1 && j <= 8) 	{ 		board->square[i][j].flag = flg; 		i++, j--; 	}  	i = iQueen - 1, j = jQueen + 1; 	while (i >= 1 && i <= 8 && j >= 1 && j <= 8) 	{ 		board->square[i][j].flag = flg; 		i--, j++; 	} }  大佬 能帮忙看下吗

user: user-4
content: 很明显, Changeflag 函数里面写入 board.squre 数组时发生了越界