[英]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++;
}
...第一次通過包含循環,其中i
, k
和l
最初均為零。 進一步假設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.