Почему в этом случае я получаю ошибку сегментации? - PullRequest
0 голосов
/ 19 апреля 2020

Я готовлю треугольник Серпинского, и все работает нормально, но оно показывает мне ошибку сегментации, и я не знаю, что я должен изменить в своем коде. Вот мой код:

#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;
}

Ответы [ 2 ]

4 голосов
/ 19 апреля 2020

Только что попробовал 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

Это означает, что вы касаетесь памяти за пределами границ массива. Действительно в строке

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.

0 голосов
/ 19 апреля 2020

Вам необходимо проверить границы в if check

`

#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;

}

...