2014-10-17 97 views
11

错误我有这样的代码:中止陷阱6用C

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,它是好的。当我运行该文件时,输入值后我会得到中止陷阱6错误。

我看了其他文章关于这个错误,他们不帮我。

+2

'INT板[2] [50];' - > int board [3] [50];' – BLUEPIXY 2014-10-17 18:25:24

+0

但即使如此,50是一个可能溢出的幻数。 – 5gon12eder 2014-10-17 18:28:00

回答

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

非常感谢你!有用! – user1753491 2014-10-17 19:29:49

18

你写入内存你不拥有:

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];
法律指数板[0] [0] ...板[2] [49]

EDIT为了解决坏输出评论和初始化评论

添加一个额外的 “\ 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 of 2d array to zero 
+0

是的,它确实修复了错误,ryyker。谢谢! – user1753491 2014-10-17 18:42:37

+0

@ user1753491 - 此外,板是一个整数数组,当做任务时,你不应该用零填充它们而不是'O'吗? (board [2] [i] ='O';'应该是board [2] [i] = 0;') – ryyker 2014-10-17 18:51:12

+0

@ryyker我想让它们成为我的程序的一个O.我认为我可以用ASCII码做到这一点。你懂我的意思吗?我不想处理char数组。 – user1753491 2014-10-17 19:02:14