簡體   English   中英

在這種情況下,為什么我會遇到分段錯誤?

[英]Why i m getting Segmentation Fault in this case?

我正在准備謝爾賓斯基三角形,一切正常,但它顯示了分段錯誤,我不知道我應該在我的代碼中更改什么。 這是我的代碼:

#include <stdio.h>
#include <stdlib.h>
#define  t 32
#define  x 65

void display(char s[t][x])
{
  int i,j;

     for (i = 0; i < t; i++){//algorithm
         for (j = 0; j <= x ; j++){

             if ((s[i][j] == '0' && s[i][j+1] == '0' && s[i][j + 2] == '1') || (s[i][j] == '1' && s[i][j + 1] == '0' && s[i][j + 2] == '0'))
                 s[i+1][j+1] = '1';
             else
                 s[i+1][j+1] = '0';
         }
     }

    for (i = 0; i < t; i++){//printinng
        for (j = 0; j < x; j++){
            if (s[i][j] == '1') printf("X");
            else printf(" ");
        }
        printf("\n");
  }
}
int main() {
  char sierpinski[t][x];
  int i;
  int y = (x/2);//srodek 
  for(i=0;i<x;i++){//first row
    if(i == y) sierpinski[0][i] = '1';
    else sierpinski[0][i] = '0';
  }
    display(sierpinski);
  return 0;
}

剛剛嘗試了 clang 在您的代碼上使用地址清理程序

$ clang++-9 -fsanitize=address c.cc -o test && ./test
=================================================================
==14763==ERROR: AddressSanitizer: stack-buffer-overflow on address 0x7ffd7c8ff160 at pc 0x0000004c53ea bp 0x7ffd7c8fe860 sp 0x7ffd7c8fe858
WRITE of size 1 at 0x7ffd7c8ff160 thread T0

這意味着您在陣列邊界之外觸摸 memory。 確實符合

if ((s[i][j] == '0' && s[i][j+1] == '0' && s[i][j + 2] == '1') || (s[i][j] == '1' && s[i][j + 1] == '0' && s[i][j + 2] == '0'))

索引j + 2可以大於x - 1

您需要在if檢查中檢查界限

`

#include <stdio.h>

#include <stdlib.h>
#define  t 32
#define  x 65

void display(char s[t][x])
{
  int i,j;

 for (i = 0; i < t; i++){//algorithm
     for (j = 0; j < x ; j++){
         if(j+1 < x && i+1 < t) { // Add this
            if ((s[i][j] == '0' && s[i][j+1] == '0' && s[i][j + 2] == '1') || (s[i][j] == '1' && s[i][j + 1] == '0' && s[i][j + 2] == '0'))
                 s[i+1][j+1] = '1';

            else
                 s[i+1][j+1] = '0';
         }
     }
 }

for (i = 0; i < t; i++){//printinng
    for (j = 0; j < x; j++){
        if (s[i][j] == '1') printf("X");
        else printf(" ");
    }
    printf("\n");
 }

}

  int main() {
  char sierpinski[t][x];
  int i;
  int y = (x/2);//srodek
  for(i=0;i<x;i++){//first row
if(i == y) sierpinski[0][i] = '1';
else sierpinski[0][i] = '0';

}

 display(sierpinski);
 return 0;

}

暫無
暫無

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

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