C中的中止陷阱6错误

Posted

技术标签:

【中文标题】C中的中止陷阱6错误【英文标题】:Abort trap 6 error in C 【发布时间】:2014-10-17 18:22:11 【问题描述】:

我有这个代码:

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 错误。

我查看了有关此错误的其他帖子,但它们对我没有帮助。

【问题讨论】:

int board[2][50]; --> int board[3][50]; 但即便如此,50 也是一个可能会溢出的神奇数字。 【参考方案1】:

你正在写入不属于你的内存:

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

(array initialization discussion...)

【讨论】:

@user1753491 - 另外,board 是一个整数数组,在进行分配时,您不应该用零而不是“O”填充它们吗? (board[2][i] = 'O'; 应该是board[2][i] = 0; @ryyker 我想让它们成为我的程序的 O。我想我可以以某种方式使用 ASCII 码来做到这一点。你懂我的意思吗?我不想处理 char 数组。【参考方案2】:

试试这个:

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

【讨论】:

以上是关于C中的中止陷阱6错误的主要内容,如果未能解决你的问题,请参考以下文章

中止陷阱:C 程序中的 6 个

C Hangman 程序调试辅助(中止陷阱:6 错误)[关闭]

从 OS X 中的 main 返回但不在 linux 上时中止陷阱 6

我无法按字母顺序对文件中的“姓氏”进行排序:我得到中止陷阱:6

中止陷阱:strncat() 出现 6 个错误

中止陷阱错误:6 - 它来自哪里? - 数独求解器