Ошибка прерывания ловушки 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 после ввода значений.
Я просмотрел другие сообщения об этой ошибке, и они мне не помогают.
Ответы
Ответ 1
Попробуйте следующее:
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");
}
}
Ответ 2
Вы пишете в память, которой у вас нет:
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])
^
To:
int board[3][50]; //array with 3 columns (legal indices [0-2][0-49])
^
При создании массива значение, используемое для инициализации [3]
, указывает размер массива.
При доступе к существующему массиву значения индекса основаны на нулевом значении.
Для созданного массива: int board[3][50];
Правовые индексы - это доска [0] [0]... доска [2] [49]
РЕДАКТИРОВАТЬ Чтобы устранить неудачный выходной комментарий и комментарий инициализации
добавьте дополнительный "\n" для вывода форматирования:
Изменить:
...
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
}
...
Инициализировать:
int board[3][50] = {{0}};//initialize all elements of 2d array to zero