C语言中的Abort trap 6错误

19

我有这段代码:

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

使用gcc编译时没有问题,但在运行文件后输入值后会出现abort trap 6错误。我查看了其他关于此错误的帖子,但它们对我没有帮助。


4
int board[2][50]; --> int board[3][50]; - BLUEPIXY
1
但即使如此,50仍然是一个可能会溢出的魔数。 - 5gon12eder
2个回答

30

您正在写入您未拥有的内存:

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';
          ^

将此行更改为:

int board[2][50]; //array with 2 columns (legal indices [0-1][0-49])
          ^
至:
int board[3][50]; //array with 3 columns (legal indices [0-2][0-49])
          ^
创建数组时,用于初始化的值:[3]表示数组大小。
但是,访问现有数组元素时,索引值是基于零的。 对于一个创建的数组:int board[3][50];
合法的索引是board[0][0]...board[2][49]

编辑 修正输出和初始化评论

为格式化输出添加额外的“\n”:

更改为:

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

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

初始化棋盘变量:

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

(数组初始化讨论...)


@user1753491 - 另外,board是一个整数数组,在进行赋值时,你应该用零来填充它们,而不是'O'。(board[2][i] = 'O'; 应该是 board[2][i] = 0;) - ryyker
@ryyker 我想在我的程序中将它们变成一个O。我认为我可以通过 ASCII 码来实现。你知道我是什么意思吗?我不想处理 char 数组。 - user1753491

0

试试这个:

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");
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接