сбой метода вызова: ошибка сегментации в c

#c #segmentation-fault #fault

#c #ошибка сегментации #ошибка

Вопрос:

Этот фрагмент кода является частью большого исходного кода, но ошибка здесь.

 int solve(int* unsolved_var)
{
        int i;
        for (i = 0; unsolved_var[i] != 0; i  )
        {
            int n;
            for (n = 1; n <= 9; n  )
            {
                 //if (!numInBox(unsolved_var[i], n)==1 || !numInLine()==1)

                 printf("%d  %dn", n,  unsolved_var[i]);
         numInBox(unsolved_var[i], n);//ERROR OCCURS HERE
            }
        }
}

int numInBox(int space, int n)//space is always three digits long
{
   printf("this should print but doesnt(segmentation fault)");
   char unsolved_str[3];
   sprintf(unsolved_str, "%d", space);//converts int into char[]

   printf("%s",unsolved_str);//confirms

   int check[3] = {atoi(unsolved_str[0]), 0, atoi(unsolved_str[2])};//converts char[] to int[]
  

Завершите код … его долго, он работает нормально. Если вы введете «решить», я выдам вам эту ошибку.

 `#include <stdio.h>
#include <string.h>

char grid[20][42];

void display()
{
        int j;
    int u;
    for (j = 0; j <= 19; j  )
    {
        for (u = 0; u <= 39; u  )
        {
            printf("%c",grid[j][u]);
        }
        printf("n");
    }
    printf("n");
}

int* unsolved()
{//2-18 4,8-36
int r;
int c;
   int size = 0;
   static int unsolved_var[81];
   unsolved_var[0] = 0;
   for (r = 2; r <= 18; r =2)
   {
       for (c = 4; c <=36; c =4)
       {
           if (grid[r][c] == ' ')
           {
           if (c <= 9)
               {
                   unsolved_var[size] = r/2*100   c/4;
                   size  ;
                   unsolved_var[size] = 0;//sets end of array
               }
               else
               {
                   unsolved_var[size] = r/2*100   c/4;
                   size  ;
                   unsolved_var[size] = 0;
               }
        // 100   1000    100   1000
            //2-0-4 2-0-10 10-0-4 10-0-10
           }
       }
   }
int p;
//for (p = 0; p <= size; p  ){printf("%d", unsolved_var[p]);}
return unsolved_var;
}

int numInBox(int space, int n)
{
   char unsolved_str[3];
   sprintf(unsolved_str, "%d", space);

   printf("%s",unsolved_str);

   int check[3] = {atoi(unsolved_str[0]), 0, atoi(unsolved_str[2])};

}//***********************************************************************

static int x = 0;
int solve(int* unsolved_var)
{
   if (unsolved_var[0] == 0 || x == 10){return 0;}
   else
   {
        int i;
        for (i = 0; unsolved_var[i] != 0; i  )
        {
            int n;
            for (n = 1; n <= 9; n  )
            {
                 //if (!numInBox(unsolved_var[i], n)==1 || !numInLine()==1)

                 printf("%d  %dn", n,  unsolved_var[i]);//
         numInBox(unsolved_var[i], n);
            }
        }
    x  ;
   }
}

main()
{
//*****************************GRID******************************
//2 4 6 8 10 12 14 16 18
//3-5 7-9 11-13 15-17 19-21 23-25 27-29 31-33 35-37
        char top[] =   "t  1   2   3   4   5   6   7   8   9  ";
    char line0[] = "t --- --- --- --- --- --- --- --- --- ";
    char field1[]="1t|   |   |   |   |   |   |   |   |   |";
    char line1[] = "t --- --- --- --- --- --- --- --- --- ";
    char field2[]="2t|   |   |   |   |   |   |   |   |   |";
    char line2[] = "t --- --- --- --- --- --- --- --- --- ";
    char field3[]="3t|   |   |   |   |   |   |   |   |   |";
    char line3[] = "t --- --- --- --- --- --- --- --- --- ";
    char field4[]="4t|   |   |   |   |   |   |   |   |   |";
    char line4[] = "t --- --- --- --- --- --- --- --- --- ";
    char field5[]="5t|   |   |   |   |   |   |   |   |   |";
    char line5[] = "t --- --- --- --- --- --- --- --- --- ";
    char field6[]="6t|   |   |   |   |   |   |   |   |   |";
    char line6[] = "t --- --- --- --- --- --- --- --- --- ";
    char field7[]="7t|   |   |   |   |   |   |   |   |   |";
    char line7[] = "t --- --- --- --- --- --- --- --- --- ";
    char field8[]="8t|   |   |   |   |   |   |   |   |   |";
    char line8[] = "t --- --- --- --- --- --- --- --- --- ";
    char field9[]="9t|   |   |   |   |   |   |   |   |   |";
    char line9[] = "t --- --- --- --- --- --- --- --- --- ";

        int o;
        for (o = 0; o <= 39; o  )
        {
            grid[0][o] = top[o];
        grid[1][o] = line0[o];
        grid[2][o] = field1[o];
        grid[3][o] = line1[o];
        grid[4][o] = field2[o];
        grid[5][o] = line2[o];
        grid[6][o] = field3[o];
        grid[7][o] = line3[o];
        grid[8][o] = field4[o];
        grid[9][o] = line4[o];
        grid[10][o] = field5[o];
        grid[11][o] = line5[o];
        grid[12][o] = field6[o];
        grid[13][o] = line6[o];
        grid[14][o] = field7[o];
        grid[15][o] = line7[o];
        grid[16][o] = field8[o];
        grid[17][o] = line8[o];
        grid[18][o] = field9[o];
        grid[19][o] = line9[o];
        }
    display();
//****************************INPUT******************************
while(1)
{
  char input_raw[7];
  printf("Enter a Commandn");
  fgets(input_raw, 256, stdin);
  input_raw[strlen(input_raw)-1] = '';

if (strcmp(input_raw, "solve") == 0){solve(unsolved());}
else
{
  char *first = input_raw;
  char *second = input_raw; 
  char *third = input_raw;

  char *copy = input_raw;

  int flag = 1;
  while (*copy) 
  {
    if (*copy == ',') 
    {
      *copy = ''; 
      if (flag==0) {third =   copy;}
      if (flag==1) {second =   copy; flag = 0;}

    }
    else copy  ;
  }

  switch (first[0])
  {
      case '1':
      {
          switch (second[0])
          {
              case '1':{grid[2][3] = '*'; grid[2][4]=third[0]; grid[2][5] = '*'; break;}
              case '2':{grid[2][7] = '*'; grid[2][8]=third[0]; grid[2][9] = '*'; break;}
              case '3':{grid[2][11] = '*';grid[2][12]=third[0];grid[2][13] = '*';break;}
              case '4':{grid[2][15] = '*';grid[2][16]=third[0];grid[2][17] = '*';break;}
              case '5':{grid[2][19] = '*';grid[2][20]=third[0];grid[2][21] = '*';break;}
              case '6':{grid[2][23] = '*';grid[2][24]=third[0];grid[2][25] = '*';break;}
              case '7':{grid[2][27] = '*';grid[2][28]=third[0];grid[2][29] = '*';break;}
              case '8':{grid[2][31] = '*';grid[2][32]=third[0];grid[2][33] = '*';break;}
              case '9':{grid[2][35] = '*';grid[2][36]=third[0];grid[2][37] = '*';break;}
          }
          break;
      }
      case '2':
      {
          switch (second[0])
          {
              case '1':{grid[4][3] = '*'; grid[4][4]=third[0]; grid[4][5] = '*'; break;}
              case '2':{grid[4][7] = '*'; grid[4][8]=third[0]; grid[4][9] = '*'; break;}
              case '3':{grid[4][11] = '*';grid[4][12]=third[0];grid[4][13] = '*';break;}
              case '4':{grid[4][15] = '*';grid[4][16]=third[0];grid[4][17] = '*';break;}
              case '5':{grid[4][19] = '*';grid[4][20]=third[0];grid[4][21] = '*';break;}
              case '6':{grid[4][23] = '*';grid[4][24]=third[0];grid[4][25] = '*';break;}
              case '7':{grid[4][27] = '*';grid[4][28]=third[0];grid[4][29] = '*';break;}
              case '8':{grid[4][31] = '*';grid[4][32]=third[0];grid[4][33] = '*';break;}
              case '9':{grid[4][35] = '*';grid[4][36]=third[0];grid[4][37] = '*';break;}
          }
          break;
      }
      case '3':
      {
          switch (second[0])
          {
              case '1':{grid[6][3] = '*'; grid[6][4]=third[0]; grid[6][5] = '*'; break;}
              case '2':{grid[6][7] = '*'; grid[6][8]=third[0]; grid[6][9] = '*'; break;}
              case '3':{grid[6][11] = '*';grid[6][12]=third[0];grid[6][13] = '*';break;}
              case '4':{grid[6][15] = '*';grid[6][16]=third[0];grid[6][17] = '*';break;}
              case '5':{grid[6][19] = '*';grid[6][20]=third[0];grid[6][21] = '*';break;}
              case '6':{grid[6][23] = '*';grid[6][24]=third[0];grid[6][25] = '*';break;}
              case '7':{grid[6][27] = '*';grid[6][28]=third[0];grid[6][29] = '*';break;}
              case '8':{grid[6][31] = '*';grid[6][32]=third[0];grid[6][33] = '*';break;}
              case '9':{grid[6][35] = '*';grid[6][36]=third[0];grid[6][37] = '*';break;}
          }
          break;
      }
      case '4':
      {
          switch (second[0])
          {
              case '1':{grid[8][3] = '*'; grid[8][4]=third[0]; grid[8][5] = '*'; break;}
              case '2':{grid[8][7] = '*'; grid[8][8]=third[0]; grid[8][9] = '*'; break;}
              case '3':{grid[8][11] = '*';grid[8][12]=third[0];grid[8][13] = '*';break;}
              case '4':{grid[8][15] = '*';grid[8][16]=third[0];grid[8][17] = '*';break;}
              case '5':{grid[8][19] = '*';grid[8][20]=third[0];grid[8][21] = '*';break;}
              case '6':{grid[8][23] = '*';grid[8][24]=third[0];grid[8][25] = '*';break;}
              case '7':{grid[8][27] = '*';grid[8][28]=third[0];grid[8][29] = '*';break;}
              case '8':{grid[8][31] = '*';grid[8][32]=third[0];grid[8][33] = '*';break;}
              case '9':{grid[8][35] = '*';grid[8][36]=third[0];grid[8][37] = '*';break;}
          }
          break;
      }
      case '5':
      {
          switch (second[0])
          {
              case '1':{grid[10][3] = '*'; grid[10][4]=third[0]; grid[10][5] = '*'; break;}
              case '2':{grid[10][7] = '*'; grid[10][8]=third[0]; grid[10][9] = '*'; break;}
              case '3':{grid[10][11] = '*';grid[10][12]=third[0];grid[10][13] = '*';break;}
              case '4':{grid[10][15] = '*';grid[10][16]=third[0];grid[10][17] = '*';break;}
              case '5':{grid[10][19] = '*';grid[10][20]=third[0];grid[10][21] = '*';break;}
              case '6':{grid[10][23] = '*';grid[10][24]=third[0];grid[10][25] = '*';break;}
              case '7':{grid[10][27] = '*';grid[10][28]=third[0];grid[10][29] = '*';break;}
              case '8':{grid[10][31] = '*';grid[10][32]=third[0];grid[10][33] = '*';break;}
              case '9':{grid[10][35] = '*';grid[10][36]=third[0];grid[10][37] = '*';break;}
          }
          break;
      }
      case '6':
      {
          switch (second[0])
          {
              case '1':{grid[12][3] = '*'; grid[12][4]=third[0]; grid[12][5] = '*'; break;}
              case '2':{grid[12][7] = '*'; grid[12][8]=third[0]; grid[12][9] = '*'; break;}
              case '3':{grid[12][11] = '*';grid[12][12]=third[0];grid[12][13] = '*';break;}
              case '4':{grid[12][15] = '*';grid[12][16]=third[0];grid[12][17] = '*';break;}
              case '5':{grid[12][19] = '*';grid[12][20]=third[0];grid[12][21] = '*';break;}
              case '6':{grid[12][23] = '*';grid[12][24]=third[0];grid[12][25] = '*';break;}
              case '7':{grid[12][27] = '*';grid[12][28]=third[0];grid[12][29] = '*';break;}
              case '8':{grid[12][31] = '*';grid[12][32]=third[0];grid[12][33] = '*';break;}
              case '9':{grid[12][35] = '*';grid[12][36]=third[0];grid[12][37] = '*';break;}
          }
          break;
      }
      case '7':
      {
          switch (second[0])
          {
              case '1':{grid[14][3] = '*'; grid[14][4]=third[0]; grid[14][5] = '*'; break;}
              case '2':{grid[14][7] = '*'; grid[14][8]=third[0]; grid[14][9] = '*'; break;}
              case '3':{grid[14][11] = '*';grid[14][12]=third[0];grid[14][13] = '*';break;}
              case '4':{grid[14][15] = '*';grid[14][16]=third[0];grid[14][17] = '*';break;}
              case '5':{grid[14][19] = '*';grid[14][20]=third[0];grid[14][21] = '*';break;}
              case '6':{grid[14][23] = '*';grid[14][24]=third[0];grid[14][25] = '*';break;}
              case '7':{grid[14][27] = '*';grid[14][28]=third[0];grid[14][29] = '*';break;}
              case '8':{grid[14][31] = '*';grid[14][32]=third[0];grid[14][33] = '*';break;}
              case '9':{grid[14][35] = '*';grid[14][36]=third[0];grid[14][37] = '*';break;}
          }
          break;
      }
      case '8':
      {
          switch (second[0])
          {
              case '1':{grid[16][3] = '*'; grid[16][4]=third[0]; grid[16][5] = '*'; break;}
              case '2':{grid[16][7] = '*'; grid[16][8]=third[0]; grid[16][9] = '*'; break;}
              case '3':{grid[16][11] = '*';grid[16][12]=third[0];grid[16][13] = '*';break;}
              case '4':{grid[16][15] = '*';grid[16][16]=third[0];grid[16][17] = '*';break;}
              case '5':{grid[16][19] = '*';grid[16][20]=third[0];grid[16][21] = '*';break;}
              case '6':{grid[16][23] = '*';grid[16][24]=third[0];grid[16][25] = '*';break;}
              case '7':{grid[16][27] = '*';grid[16][28]=third[0];grid[16][29] = '*';break;}
              case '8':{grid[16][31] = '*';grid[16][32]=third[0];grid[16][33] = '*';break;}
              case '9':{grid[16][35] = '*';grid[16][36]=third[0];grid[16][37] = '*';break;}
          }
          break;
      }
      case '9':
      {
          switch (second[0])
          {
              case '1':{grid[18][3] = '*'; grid[18][4]=third[0]; grid[18][5] = '*'; break;}
              case '2':{grid[18][7] = '*'; grid[18][8]=third[0]; grid[18][9] = '*'; break;}
              case '3':{grid[18][11] = '*';grid[18][12]=third[0];grid[18][13] = '*';break;}
              case '4':{grid[18][15] = '*';grid[18][16]=third[0];grid[18][17] = '*';break;}
              case '5':{grid[18][19] = '*';grid[18][20]=third[0];grid[18][21] = '*';break;}
              case '6':{grid[18][23] = '*';grid[18][24]=third[0];grid[18][25] = '*';break;}
              case '7':{grid[18][27] = '*';grid[18][28]=third[0];grid[18][29] = '*';break;}
              case '8':{grid[18][31] = '*';grid[18][32]=third[0];grid[18][33] = '*';break;}
              case '9':{grid[18][35] = '*';grid[18][36]=third[0];grid[18][37] = '*';break;}
          }
          break;
      }
  }
}
display();
}
}
  

Комментарии:

1. пожалуйста, будьте более подробными, мы не можем видеть весь код. Убедитесь, что у вас есть 0 значение в unsolved_var массиве, иначе цикл for никогда не завершится и начнет обращаться к недопустимой области.

2. У Phoxis есть одна возможная причина, что вы неправильно завершаете работу. Другая возможность заключается в том, что вы неправильно запускаетесь ; мы не можем видеть, откуда вы получаете unsolved_var . Это может быть случайный мусор.

3. @Andrew, это вызвало бы ошибку, но не этот segfault.

4. Не беспокойтесь о цикле. Все работает, пока я не вызову numInBox. Это из-за моего вызова atoi.

Ответ №1:

Есть (по крайней мере) две проблемы в numInBox первой, unsolved_str нет места для завершения nul, поэтому вы строчите в стеке. Второй atoi принимает char* значение, но вы даете ему char аргумент. (Должен был получить хотя бы предупреждение об этом.) Это почти наверняка приведет к ошибке сегментации внутри atoi .

Комментарии:

1. о, да, это так. Я прокомментировал это, и это не привело к ошибке сегментации. Как мне тогда передать это через atoi? Я думал, atoi просто работал с преобразованием char в int.

2. Нет, atoi преобразует строку, заканчивающуюся нулем ( char* ), в int. Преобразовать одиночный символ в целое число легко (без проверки ошибок): unsolved_str[0] - '0' .

Ответ №2:

Поскольку printf() буферы, использовать его в качестве индикатора того, на какой именно строке происходит ошибка сегментации, обычно не является хорошей идеей. В общем, записи в stderr не буферизуются, как в stdout , поэтому, если вы хотите увидеть, как далеко вы продвинулись до сбоя, вам следует сделать что-то вроде fprintf(stderr, "Got Here before crash...n");

При этом ваша реальная проблема заключается в строке

 int check[3] = {atoi(unsolved_str[0]), 0, atoi(unsolved_str[2])};
  

Если вы посмотрите на предупреждения вашего компилятора, вы должны увидеть что-то вроде:

 warning: passing argument 1 of ‘atoi’ makes pointer from integer without a cast
/usr/include/stdlib.h:148: note: expected ‘const char *’ but argument is of type ‘char 

Вам нужно переписать эту строку так, чтобы вы передавали постоянные указатели на char на atoi() , а не объекты типа char . Итак, попробуйте это, добавив оператор address-of:

 int check[3] = {atoi(amp;unsolved_str[0]), 0, atoi(amp;unsolved_str[2])};
  

Теперь будет передан правильный тип указателя, который atoi ожидается.

Ответ №3:

Мы не можем видеть весь код, но я думаю, что вы определили char unsolved_str[3]; и, вероятно, передали его в int solve(int* unsolved_var) . Итак, вы передали массив символов в качестве int * аргумента.

Также в solve цикле for вы просматриваете массив, пока a 0 не найден. Если в массиве нет 0, то цикл выйдет за пределы диапазона массива. Поэтому также включите длину массива в качестве проверки граничного условия в for цикле.

Снова во внутреннем for цикле вы повторили цикл с i=1 до 9 . Пожалуйста, проверьте границы массива и достаточно ли выделенного места в переданном массиве для доступа к индексу элемента 9 .

Ответ №4:

Вы должны оставить место для нулевого ограничителя строки. Используйте 4 символа, а не 3.

Ответ №5:

Эта часть вызывает беспокойство:

 char unsolved_str[3];
sprintf(unsolved_str, "%d", space);//converts int into char[]
  

В строке, unsolved_str если space это действительно три цифры, нет места для нулевого символа завершения. Вам нужно место для четвертого символа.

Комментарии:

1. спасибо. Но это не исправило ошибку.