C语言 ***检测到堆栈崩溃***

jpfvwuh4  于 2023-04-11  发布在  其他
关注(0)|答案(1)|浏览(132)

当我在Windows上运行代码时(CodeBlocks),一切正常,但当我在Linux上运行时,它说***检测到堆栈崩溃***,除了板外不打印任何东西;下面是代码:

#include <stdio.h>
#include <stdlib.h>


void inimatri(char mat[7][7]){

    int l=0,c=0;

    while (l<8){
        while (c<8){
            mat[l][c]='.';
            c=c+1;
        }
    c=0;
    l=l+1;
    }

    mat[3][3]='O';
    mat[3][4]='X';
    mat[4][3]='X';
    mat[4][4]='O';
    mat[2][5]='O';
    mat[5][2]='O';
    mat[3][2]='O';
    mat[5][4]='O';

}
void showmat (char mat[7][7]){

    int l=0,c=0;

    printf("  0 1 2 3 4 5 6 7");

    while (l<8){
        printf( "\n%d",l);
        while (c<8){
            printf( " %c",mat[l][c]);
            c=c+1;
        }
    c=0;
    l=l+1;
    }

}

int hord(char mat[7][7], int l, int c, char pecaac){
    int legal;
    if (c== 7){
        return 0;
    }
    if (mat[l][c]!='.'){
        return 0;
    }
    if (mat[l][c+1]==pecaac){
        return 0;
    }
    while ((c+1)<8){
        if (mat[l][c+1]=='.'){
            return 0;

        }
        else if (mat[l][c+1]== pecaac){
            return 1;
        }
        else{
            legal= 0;
        }
     c=c+1;
    }
    return(legal);
}

int hore(char mat[7][7], int l, int c, char pecaac){
    int legal=0;

    if (c== 0){
        return 0;
    }
    if (mat[l][c]!='.'){
        return 0;
    }
    if (mat[l][c-1]==pecaac){
        return 0;
    }
    while (0<=(c-1)){
        if (mat[l][c-1]=='.'){
            return 0;

        }
        else if (mat[l][c-1]== pecaac){
            return 1;
        }
        else {
            legal=0;
        }

     c=c-1;
    }
    return (legal);
}

int verb(char mat[7][7], int l, int c, char pecaac){
    int legal;
    if (l== 7){
        return 0;
    }
    if (mat[l][c]!='.'){
        return 0;
    }
    if (mat[l+1][c]==pecaac){
        return 0;
    }
    while ((l+1)<8){
        if (mat[l+1][c]=='.'){
            return 0;

        }
        else if (mat[l+1][c]== pecaac){
            return 1;
        }
        else{
            legal=0;
        }
     l=l+1;
    }
    return (legal);
}

int verc(char mat[7][7], int l, int c, char pecaac){
    int legal;
    if (l== 0){
        return 0;
    }
    if (mat[l][c]!='.'){
        return 0;
    }
    if (mat[l-1][c]==pecaac){
        return 0;
    }
    while (0<=(l-1)){
        if (mat[l-1][c]=='.'){
            return 0;

        }
        else if (mat[l-1][c]== pecaac){
            return 1;
        }
        else{
            legal = 0;
        }
     l=l-1;
    }
    return (legal);
}

int diads(char mat[7][7], int l, int c, char pecaac){
    int legal;
    if (l== 0 || c== 7){
        return 0;
    }
    if (mat[l][c]!='.'){
        return 0;
    }
    if (mat[l-1][c+1]==pecaac){
        return 0;
    }
    while (0<=(l-1) && c+1<8){
        if (mat[l-1][c+1]=='.'){
            return 0;

        }
        else if (mat[l-1][c+1]== pecaac){
            return 1;
        }
        else{
            legal = 0;
        }
     l=l-1;
     c=c+1;
    }
    return (legal);
}

int diadi(char mat[7][7], int l, int c, char pecaac){
    int legal;
    if (l== 7 || c== 7){
        return 0;
    }
    if (mat[l][c]!='.'){
        return 0;
    }
    if (mat[l+1][c+1]==pecaac){
        return 0;
    }
    while ((l+1)<8 && (c+1)<8){
        if (mat[l+1][c+1]=='.'){
            return 0;

        }
        else if (mat[l+1][c+1]== pecaac){
            return 1;
        }
        else{
            legal = 0;
        }
     l=l+1;
     c=c+1;
    }
    return (legal);
}
int diaes(char mat[7][7], int l, int c, char pecaac){
    int legal;
    if (l== 0 || c== 0){
        return 0;
    }
    if (mat[l][c]!='.'){
        return 0;
    }
    if (mat[l-1][c-1]==pecaac){
        return 0;
    }
    while (0<=(l-1) && 0<=(c-1)){
        if (mat[l-1][c-1]=='.'){
            return 0;

        }
        else if (mat[l-1][c-1]== pecaac){
            return 1;
        }
        else{
            legal = 0;
        }
     l=l-1;
     c=c-1;
    }
    return (legal);
}

int diaei(char mat[7][7], int l, int c, char pecaac){
    int legal;
    if (l== 7 || c== 0){
        return 0;
    }
    if (mat[l][c]!='.'){
        return 0;
    }
    if (mat[l+1][c-1]==pecaac){
        return 0;
    }
    while ((l+1)<8 && 0<=(c-1)){
        if (mat[l+1][c-1]=='.'){
            return 0;

        }
        else if (mat[l+1][c-1]== pecaac){
            return 1;
        }
        else{
            legal = 0;
        }
     l=l+1;
     c=c-1;
    }
    return (legal);
}

int clegal(char mat[7][7], int l, int c, char pecaac){
    int ld,le,lc,lb;
    int ldi, lds,lei,les;
    int legal=0;
    lb=verb(mat,l,c,pecaac);
    lc=verc(mat,l,c,pecaac);
    le=hore(mat,l,c,pecaac);
    ld=hord(mat,l,c,pecaac);
    ldi=diadi(mat,l,c,pecaac);
    lds=diads(mat,l,c,pecaac);
    lei=diaei(mat,l,c,pecaac);
    les=diaes(mat,l,c,pecaac);

    legal = lb+lc+le+ld+ldi+lds+lei+les;
    printf("\n %d",legal);
    if (legal==0){
        printf("Jogada ilegal");
    }
    else{
        return 1;
    }

}

int main(int argc, char *argv[])

{
    char matriz[7][7];
    char pecaj, pecaai;
    int x,y;

    pecaj='X';
    pecaai='O';
    inimatri(matriz);
    showmat(matriz);

    x=6;
    y=4;

    clegal(matriz,x,y,pecaj);

    return 0;
}

我试着检查我是否添加了比数组可以存储的更多的数字,但我没有找到任何问题,也搜索了其他解决方案,但没有找到任何东西

gt0wga4j

gt0wga4j1#

在我的Linux系统上测试你的代码时,它确实抛出了一个粉碎性错误。在审查你的代码时,有几件事似乎突出了,这似乎有助于以粉碎性错误结束。
首先,正如上面的好评论中所指出的,似乎有一些混乱,当数组元素开始于“1”或“0”时,而且似乎程序真的打算使用“8 x 8”数组而不是“7 x 7”数组。
在回顾下面的“printf”语句时,显然要使用“8 x 8”数组。

printf("  0 1 2 3 4 5 6 7");

因此,考虑到这一点,我对程序进行了一些重构,设置了一个“8 x 8”数组沿着利用从“0”到“7”的范围来符合“C”程序中常见和习惯的索引下标。

#include <stdio.h>
#include <stdlib.h>

void inimatri(char mat[8][8])   /* Going by the printout of rows and columns, it is intimated that there are eight rows and eight columns */
{
    int l=0,c=0;

    while (l<8)
    {
        while (c<8)
        {
            mat[l][c]='.';
            c=c+1;
        }
        c=0;
        l=l+1;
    }

    mat[3][3]='O';
    mat[3][4]='X';
    mat[4][3]='X';
    mat[4][4]='O';
    mat[2][5]='O';
    mat[5][2]='O';
    mat[3][2]='O';
    mat[5][4]='O';
}

void showmat (char mat[8][8])
{

    int l=0,c=0;

    printf("  0 1 2 3 4 5 6 7");

    while (l<8)
    {
        printf( "\n%d",l);
        while (c<8)
        {
            printf( " %c",mat[l][c]);
            c=c+1;
        }
        c=0;
        l=l+1;
    }
}

int hord(char mat[8][8], int l, int c, char pecaac)
{
    int legal;
    if (c== 8)
    {
        return 0;
    }
    if (mat[l][c]!='.')
    {
        return 0;
    }
    if (mat[l][c+1]==pecaac)
    {
        return 0;
    }
    while ((c+1)<8)
    {
        if (mat[l][c+1]=='.')
        {
            return 0;

        }
        else if (mat[l][c+1]== pecaac)
        {
            return 1;
        }
        else
        {
            legal= 0;
        }
        c=c+1;
    }
    return(legal);
}

int hore(char mat[8][8], int l, int c, char pecaac)
{
    int legal=0;

    if (c== 0)
    {
        return 0;
    }
    if (mat[l][c]!='.')
    {
        return 0;
    }
    if (mat[l][c-1]==pecaac)
    {
        return 0;
    }
    while (0<=(c-1))
    {
        if (mat[l][c-1]=='.')
        {
            return 0;

        }
        else if (mat[l][c-1]== pecaac)
        {
            return 1;
        }
        else
        {
            legal=0;
        }

        c=c-1;
    }
    return (legal);
}

int verb(char mat[8][8], int l, int c, char pecaac)
{
    int legal;
    if (l== 8)
    {
        return 0;
    }
    if (mat[l][c]!='.')
    {
        return 0;
    }
    if (mat[l+1][c]==pecaac)
    {
        return 0;
    }
    while ((l+1)<8)
    {
        if (mat[l+1][c]=='.')
        {
            return 0;

        }
        else if (mat[l+1][c]== pecaac)
        {
            return 1;
        }
        else
        {
            legal=0;
        }
        l=l+1;
    }
    return (legal);
}

int verc(char mat[8][8], int l, int c, char pecaac)
{
    int legal;
    if (l== 0)
    {
        return 0;
    }
    if (mat[l][c]!='.')
    {
        return 0;
    }
    if (mat[l-1][c]==pecaac)
    {
        return 0;
    }
    while (0<=(l-1))
    {
        if (mat[l-1][c]=='.')
        {
            return 0;

        }
        else if (mat[l-1][c]== pecaac)
        {
            return 1;
        }
        else
        {
            legal = 0;
        }
        l=l-1;
    }
    return (legal);
}

int diads(char mat[8][8], int l, int c, char pecaac)
{
    int legal;
    if (l== 0 || c== 8)
    {
        return 0;
    }
    if (mat[l][c]!='.')
    {
        return 0;
    }
    if (mat[l-1][c+1]==pecaac)
    {
        return 0;
    }
    while (0<=(l-1) && c+1<8)
    {
        if (mat[l-1][c+1]=='.')
        {
            return 0;

        }
        else if (mat[l-1][c+1]== pecaac)
        {
            return 1;
        }
        else
        {
            legal = 0;
        }
        l=l-1;
        c=c+1;
    }
    return (legal);
}

int diadi(char mat[8][8], int l, int c, char pecaac)
{
    int legal;
    if (l== 8 || c== 8)
    {
        return 0;
    }
    if (mat[l][c]!='.')
    {
        return 0;
    }
    if (mat[l+1][c+1]==pecaac)
    {
        return 0;
    }
    while ((l+1)<8 && (c+1)<8)
    {
        if (mat[l+1][c+1]=='.')
        {
            return 0;

        }
        else if (mat[l+1][c+1]== pecaac)
        {
            return 1;
        }
        else
        {
            legal = 0;
        }
        l=l+1;
        c=c+1;
    }
    return (legal);
}

int diaes(char mat[8][8], int l, int c, char pecaac)
{
    int legal;
    if (l== 0 || c== 0)
    {
        return 0;
    }
    if (mat[l][c]!='.')
    {
        return 0;
    }
    if (mat[l-1][c-1]==pecaac)
    {
        return 0;
    }
    while (0<=(l-1) && 0<=(c-1))
    {
        if (mat[l-1][c-1]=='.')
        {
            return 0;

        }
        else if (mat[l-1][c-1]== pecaac)
        {
            return 1;
        }
        else
        {
            legal = 0;
        }
        l=l-1;
        c=c-1;
    }
    return (legal);
}

int diaei(char mat[8][8], int l, int c, char pecaac)
{
    int legal;
    if (l== 7 || c== 0)
    {
        return 0;
    }
    if (mat[l][c]!='.')
    {
        return 0;
    }
    if (mat[l+1][c-1]==pecaac)
    {
        return 0;
    }
    while ((l+1)<8 && 0<=(c-1))
    {
        if (mat[l+1][c-1]=='.')
        {
            return 0;

        }
        else if (mat[l+1][c-1]== pecaac)
        {
            return 1;
        }
        else
        {
            legal = 0;
        }
        l=l+1;
        c=c-1;
    }
    return (legal);
}

int clegal(char mat[8][8], int l, int c, char pecaac)
{
    int ld,le,lc,lb;
    int ldi, lds,lei,les;
    int legal=0;
    lb=verb(mat,l,c,pecaac);
    lc=verc(mat,l,c,pecaac);
    le=hore(mat,l,c,pecaac);
    ld=hord(mat,l,c,pecaac);
    ldi=diadi(mat,l,c,pecaac);
    lds=diads(mat,l,c,pecaac);
    lei=diaei(mat,l,c,pecaac);
    les=diaes(mat,l,c,pecaac);

    legal = lb+lc+le+ld+ldi+lds+lei+les;
    printf("\nLegal: %d\n",legal);      /* Just to clarify what this value is when it is printed */
    if (legal==0)
    {
        printf("Jogada ilegal");
    }
    else
    {
        return 1;
    }
    return 0;   /* Added this to address a compiler warning regarding not returning an integer value if this point is reached */
}

int main(int argc, char *argv[])
{
    char matriz[8][8];
    char pecaj, pecaai;     /* FYI - the compiler warned that variable pecaai is set but not used */
    int x,y;

    pecaj='X';
    pecaai='O';
    inimatri(matriz);
    showmat(matriz);

    x=6;
    y=4;

    clegal(matriz,x,y,pecaj);

    return 0;
}

要指出的一些关键项目。

  • 如上所述,二维阵列被放大到“8X8”的大小,其中索引值在从“0”到“7”的范围内。
  • 根据需要修改“if”测试,以确保索引值大于或等于“0”且小于或等于“7”。
  • 为了解决“clegal”函数中的编译器警告,添加了一个额外的“return”语句作为捕获所有条件,以确保在到达函数末尾时返回正确的整数值。

有了这些,下面是我的Linux系统上终端的示例输出。

@Vera:~/C_Programs/Console/Smash/bin/Release$ ./Smash 
  0 1 2 3 4 5 6 7
0 . . . . . . . .
1 . . . . . . . .
2 . . . . . O . .
3 . . O O X . . .
4 . . . X O . . .
5 . . O . O . . .
6 . . . . . . . .
7 . . . . . . . .
Legal: 1

在您空闲的时候检查这个重构的代码,看看它是否符合您项目的精神。

相关问题