簡體   English   中英

C中二維數組的分割錯誤

[英]Segmentation Fault for 2d array in C

橙色叉號由矩陣的“ G”制成,並且有效。 藍色由“ B”制成,無效

以下代碼用於從2D數組(由'G'和'B'制成)中以相等的手長找到2個可能的最大交叉區域。 十字架應由“ G”組成。 以下代碼在掃描2D矩陣時/掃描后給我分段錯誤。 請幫忙!!

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

int main() {
int i,j,k,l,p,q;
char M[10][10];
int m, n;
int min=0;
int rl=0;
int max1=1;
int max2=1;
int area;
int tarea;
int cu=0;
scanf("%d",&n);
scanf("%d",&m);
//matrix scan
for(i=0;i<n;i++){
  for(j=0;j<m;j++){
    scanf("%c",&M[i][j]);

  }
}
 // finding first cross

for(i=0;i<n;i++){
   for(j=0;j<n;j++){
     k=j;
     l=k;
    p=i;
    q=i;
    while(M[i][k]!='B' || M[i][l]!='B' || l!=m || k!=0){
        k--;
        l++;
        rl++;
    }

    while(M[p][j]!='B' || M[q][j]!='B' || p!=0 || q!=n){
        p--;
        q++;
        cu++;
    }
    if(rl>cu){
    min=cu;
    }
    else
    min=rl;
    area=min*4+1;
    if(area>max2){
    max2=area;
    }
    if(area>max1){
    max1=area;
    }

    }
  }

tarea=max1+max2;
printf("%d",tarea);

return 0;
}

您的兩個while循環可以很容易地產生對數組M的越界訪問。 考慮一下,例如...

while(M[i][k]!='B' || M[i][l]!='B' || l!=m || k!=0){
    k--;
    l++;
    rl++;
}

...第一次通過包含循環,其中ikl最初均為零。 進一步假設M[0][0]的值不同於'B' 然后將執行循環的主體,導致k取值-1 ,然后再次對控制表達式求值,從而嘗試讀取M[0][-1] 結果是不確定的,但是出現分段錯誤(后來或以后)是完全合理的。

你需要做好邊界測試,你需要使用&&而非|| 以確保在達到界限時實際上退出循環。 對我來說,現在尚不清楚您要在邊緣執行什么操作,但這是基本思路:

while((k > 0) && (l < m) && (M[i][k] != 'B' || M[i][l] != 'B')) {
    k--;
    l++;
    rl++;
}

類似的情況也適用於您的其他while循環。

這些不是唯一的問題,但可能是您所要求的行為負責的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM