2014-10-17 29 views
11

tôi có mã này:Abort bẫy 6 lỗi trong 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; 
} 

Khi tôi biên dịch này với gcc, nó là tốt. Khi tôi chạy tập tin, tôi nhận được lỗi abort trap 6 sau khi nhập các giá trị.

Tôi đã xem các bài đăng khác về lỗi này và họ không giúp tôi.

+2

'int ban [2] [50]; '- > 'int board [3] [50];' – BLUEPIXY

+0

Nhưng ngay cả sau đó, 50 là một số ma thuật có thể tràn. – 5gon12eder

Trả lời

2

Hãy thử điều này:

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

Cảm ơn bạn rất nhiều! Nó hoạt động! – user1753491

18

Bạn đang viết vào bộ nhớ bạn không sở hữu:

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

Thay đổi dòng này:

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]) 
     ^

Khi tạo một mảng, giá trị sử dụng để khởi tạo [3] cho biết kích thước mảng.
Khi truy cập mảng hiện có, giá trị chỉ mục là không dựa trên.

Đối với một mảng tạo: int board[3][50];
chỉ số pháp lý là hội đồng quản trị [0] [0] ... ban [2] [49]

EDIT Để giải quyết nhận xét sản lượng xấu và khởi comment

thêm một "\ n" bổ sung cho đầu ra định dạng:

Thay đổi:

... 
    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 
} 
... 
biến

Initialize board:

int board[3][50] = {{0}};//initialize all elements of 2d array to zero 
+0

Có, nó đã sửa lỗi, ryyker. Cảm ơn! – user1753491

+0

@ user1753491 - cũng vậy, bảng là một mảng số nguyên, khi thực hiện các bài tập, bạn không nên điền chúng bằng số không thay vì 'O'? ('board [2] [i] = 'O';' nên là 'bảng [2] [i] = 0;') – ryyker

+0

@ryyker Tôi muốn biến chúng thành O cho chương trình của tôi. Tôi nghĩ tôi có thể làm điều đó với mã ASCII bằng cách nào đó. Bạn biết ý tôi là gì không? Tôi không muốn đối phó với mảng char. – user1753491

Các vấn đề liên quan