Abort trap 6 error in C

115,696

Solution 1

Try this:

void drawInitialNim(int num1, int num2, int num3){
    int board[3][50] = {0}; // This is a local variable. It is not possible to use it after returning from this function. 

    int i, j, k;

    for(i=0; i<num1; i++)
        board[0][i] = 'O';
    for(i=0; i<num2; i++)
        board[1][i] = 'O';
    for(i=0; i<num3; i++)
        board[2][i] = 'O';

    for (j=0; j<3;j++) {
        for (k=0; k<50; k++) {
            if(board[j][k] != 0)
                printf("%c", board[j][k]);
        }
        printf("\n");
    }
}

Solution 2

You are writing to memory you do not own:

int board[2][50]; //make an array with 3 columns  (wrong)
                  //(actually makes an array with only two 'columns')
...
for (i=0; i<num3+1; i++)
    board[2][i] = 'O';
          ^

Change this line:

int board[2][50]; //array with 2 columns (legal indices [0-1][0-49])
          ^

To:

int board[3][50]; //array with 3 columns (legal indices [0-2][0-49])
          ^

When creating an array, the value used to initialize: [3] indicates array size.
However, when accessing existing array elements, index values are zero based.

For an array created: int board[3][50];
Legal indices are board[0][0]...board[2][49]

EDIT To address bad output comment and initialization comment

add an additional "\n" for formatting output:

Change:

  ...
  for (k=0; k<50;k++) {
     printf("%d",board[j][k]);
  }
 }

       ...

To:

  ...
  for (k=0; k<50;k++) {
     printf("%d",board[j][k]);
  }
  printf("\n");//at the end of every row, print a new line
}
...  

Initialize board variable:

int board[3][50] = {0};//initialize all elements to zero

( array initialization discussion... )

Share:
115,696

Related videos on Youtube

user1753491
Author by

user1753491

Updated on July 09, 2022

Comments

  • user1753491
    user1753491 almost 2 years

    I have this code:

    void drawInitialNim(int num1, int num2, int num3)
    {
        int board[2][50]; //make an array with 3 columns
        int i; // i, j, k are loop counters
        int j;
        int k;
    
        for(i=0;i<num1+1;i++)      //fill the array with rocks, or 'O'
            board[0][i] = 'O';     //for example, if num1 is 5, fill the first row with 5 rocks
        for (i=0; i<num2+1; i++)
            board[1][i] = 'O';
        for (i=0; i<num3+1; i++)
            board[2][i] = 'O';
    
        for (j=0; j<2;j++) {       //print the array
          for (k=0; k<50;k++) {
             printf("%d",board[j][k]);
          }
        }
       return;
    }
    
    int main()
    {
        int numRock1,numRock2,numRock3;
        numRock1 = 0;
        numRock2 = 0;
        numRock3 = 0; 
        printf("Welcome to Nim!\n");
        printf("Enter the number of rocks in each row: ");
        scanf("%d %d %d", &numRock1, &numRock2, &numRock3);
        drawInitialNim(numRock1, numRock2, numRock3); //call the function
    
        return 0;
    }
    

    When I compile this with gcc, it is fine. When I run the file, I get the abort trap 6 error after entering the values.

    I have looked at other posts about this error, and they don't help me.

    • BLUEPIXY
      BLUEPIXY over 9 years
      int board[2][50]; --> int board[3][50];
    • 5gon12eder
      5gon12eder over 9 years
      But even then, 50 is a magic number that might overflow.
  • ryyker
    ryyker over 9 years
    @user1753491 - also, board is an integer array, when making assignments, shouldn't you be populating them with zeros instead of 'O'? ( board[2][i] = 'O'; should be board[2][i] = 0; )
  • user1753491
    user1753491 over 9 years
    @ryyker I want to make them an O for my program. I thought I could do that with ASCII codes somehow. Do you know what I mean? I do not want to deal with char arrays.