簡體   English   中英

如何解決此代碼中的分段錯誤?

[英]How to fix segmentation fault in this code?

如果這太愚蠢了,我感到非常抱歉,但是我只是從c開始並進行一般的編碼。 我也很抱歉這是西班牙語,希望它不要太混亂。 我正在嘗試使用矩陣對棋盤游戲進行編碼,這時我只想能夠打印棋盤。 我嘗試使用Eclipse,但不斷出現諸如command-gdb版本錯誤之類的錯誤。 我還嘗試在聯機C編譯器上運行它,但沒有成功(在這種情況下,我得到了分段錯誤)。

#include <stdio.h>
#include <stdlib.h>
char *tablero[9][9];
char Rey = 'R';
char gralOro = 'O';
char gralPlata = 'P';
char caballos = 'C';
char lanceros = 'L';
char alfil = 'A';
char torre = 'T';
char peones = 'p';
char vacio = ' ';
char *piezasNegrasPerdidas[20];
char *piezasBlancasPerdidas[20];
void initBoard(){
    for(int i = 0; i<0; i++){
        for(int j = 0; j<9; j++){
            if(i==2 || i==6){
                tablero[i][j] = &peones;
                }
            else if(i==3 || i==4 || i==5){
                tablero[i][j]=&vacio;
            }
        }
    }
    tablero[0][0] = &lanceros;
    tablero[0][1] = &caballos;
    tablero[0][2] = &gralPlata;
    tablero[0][3] = &gralOro;
    tablero[0][4] = &Rey;
    tablero[0][5] = &gralOro;
    tablero[0][6] = &gralPlata;
    tablero[0][7] = &caballos;
    tablero[0][8] = &lanceros;
    tablero[1][1] = &alfil;
    tablero[1][7] = &torre;


    tablero[8][0] = &lanceros;
    tablero[8][1] = &caballos;
    tablero[8][2] = &gralPlata;
    tablero[8][3] = &gralOro;
    tablero[8][4] = &Rey;
    tablero[8][5] = &gralOro;
    tablero[8][6] = &gralPlata;
    tablero[8][7] = &caballos;
    tablero[8][8] = &lanceros;
    tablero[7][1] = &alfil;
    tablero[7][7] = &torre;

}
void printTablero(){
    for (int r = 0; r < 9; r++){
        for(int c = 0; c<9; c++){
            printf("[%c]", *(tablero[r][c]));
        }
        printf("\n");

    }
}
int main(){
    printTablero();
    return 0;
}

我希望能夠運行此代碼,但是即使進行了一些研究,我對於可能出什么問題還是一無所知。

盡管可以通過指向char的2D指針數組以這種方式完成操作,但我不建議這樣做。 相反,只需具有2D字符數組:

char tablero[9][9]; // without the *

然后像這樣更改初始化:

tablero[0][0] = lanceros; // without the &

並打印到此:

printf("[%c]", tablero[r][c]);

同樣,您的for (int i = 0; i < 0; i++)循環永遠不會運行。 對其進行更改,以正確地初始化所有字段。 我假設您想要一個嵌套循環,將所有字段都設置為vacio 此外,您不會在任何地方調用initBoard 我猜它打算在調用printTablero之前在main調用。


最后,發生分段錯誤是因為您試圖取消引用在打印數組時未初始化的指針(因為未調用initBoard因此未初始化任何內容),從而導致未定義的行為。

您沒有對整個電路板的每個單元進行初始化。 您只需要使用ie vacio初始化它們,然后將另一個設置為cell。

#include <stdio.h>
#include <stdlib.h>
char * tablero[9][9];
char Rey = 'R';
char gralOro = 'O';
char gralPlata = 'P';
char caballos = 'C';
char lanceros = 'L';
char alfil = 'A';
char torre = 'T';
char peones = 'p';
char vacio = ' ';
char *piezasNegrasPerdidas[20];
char *piezasBlancasPerdidas[20];
void initBoard(){

    for(int i = 0; i<9; i++){
        for(int j = 0; j<9; j++){
            if(i==2 || i==6){
                tablero[i][j] = &peones;
                }
            else {
                tablero[i][j]=&vacio;
            }
        }
    }
    tablero[0][0] = &lanceros;
    tablero[0][1] = &caballos;
    tablero[0][2] = &gralPlata;
    tablero[0][3] = &gralOro;
    tablero[0][4] = &Rey;
    tablero[0][5] = &gralOro;
    tablero[0][6] = &gralPlata;
    tablero[0][7] = &caballos;
    tablero[0][8] = &lanceros;
    tablero[1][1] = &alfil;
    tablero[1][7] = &torre;


    tablero[8][0] = &lanceros;
    tablero[8][1] = &caballos;
    tablero[8][2] = &gralPlata;
    tablero[8][3] = &gralOro;
    tablero[8][4] = &Rey;
    tablero[8][5] = &gralOro;
    tablero[8][6] = &gralPlata;
    tablero[8][7] = &caballos;
    tablero[8][8] = &lanceros;
    tablero[7][1] = &alfil;
    tablero[7][7] = &torre;

}
void printTablero(){
    for (int r = 0; r < 9; r++){
        for(int c = 0; c<9; c++){
            printf("[%c]", *(tablero[r][c]));
        }
        printf("\n");

    }
}
int main(){
    initBoard();
    printTablero();
    return 0;
}

輸出

[L][C][P][O][R][O][P][C][L]
[ ][A][ ][ ][ ][ ][ ][T][ ]
[p][p][p][p][p][p][p][p][p]
[ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ]
[p][p][p][p][p][p][p][p][p]
[ ][A][ ][ ][ ][ ][ ][T][ ]
[L][C][P][O][R][O][P][C][L]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM