除了注释指出的超出数组缓冲区的字符数据之外,还有一个错误是:
int black(char** A, int n1) {
for(i = 0;i<n1;i++){
for(j = 0;j<cols;j++){
if((A[i][j] == 'X') && !visited[i][j]){
这个
n1
作为列数传入,即7。但是,如果返回
main
,您有这个:
int ROWS = 3;
int COLS = 7;
char P[ROWS][COLS]= {"OOOXOOO","OOXXOXO","OXOOOXO"};
printf("Number of islands = %d",black(P,COLS));
这个
P
数组只有3行。所以当
black
调用函数时,假设P有7行,而不是3行。这将导致
A
数组访问
A[0]
,
A[1]
,
A[2]
,(很好),但之后
A[3]
等,这是未定义的行为(在您的情况下,是崩溃)。
因此,您需要纠正列/行逻辑。
我会告诉你一个秘密。由于您最初将问题标记为C++,我花了一些时间将这些双星改为
std::vector
,并使用
at()
函数查找问题。我知道您现在已经将您的问题标记为C99,但我只想知道为什么标记很重要。我不知道C99是否具有这种自动检测边界条件的功能。