下标值既不是数组,也不是指针或向量时出错 void显示网格(结构游戏板*M,文件*stream){ int i,j; /*适当行数的malloc内存*/ M->border=malloc(sizeof(*M->border)*(M->width+4)); 对于(i=0;i宽度;i+=2){ M->border[i]=M->border[M->width+1]='+'; 对于(j=1;j宽度;j+=2){ M->border[j]=M->border[M->width]=''; fprintf(流,“%c\n”,M->border[i][j]); } } M->边框[M->宽度+2]='\0'; 流; }

下标值既不是数组,也不是指针或向量时出错 void显示网格(结构游戏板*M,文件*stream){ int i,j; /*适当行数的malloc内存*/ M->border=malloc(sizeof(*M->border)*(M->width+4)); 对于(i=0;i宽度;i+=2){ M->border[i]=M->border[M->width+1]='+'; 对于(j=1;j宽度;j+=2){ M->border[j]=M->border[M->width]=''; fprintf(流,“%c\n”,M->border[i][j]); } } M->边框[M->宽度+2]='\0'; 流; },c,arrays,pointers,C,Arrays,Pointers,我的问题是关于这行fprintf(stream,“%c\n”,M->border[i][j])会触发错误并停止整个程序的编译 目前,我只是尝试从用户从命令行提供的内容中读取高度和宽度,并使用它打印出一个二维网格,然后我可以稍后使用它进行修改等等 我有一个解决方案,我认为可能会解决它,但我不知道如何实施它。我相信为了解决这个问题,我需要将malloc border作为**,然后将行malloc作为*尝试以下方法: void display_grid(struct game_board *M

我的问题是关于这行
fprintf(stream,“%c\n”,M->border[i][j])
会触发错误并停止整个程序的编译

目前,我只是尝试从用户从命令行提供的内容中读取高度和宽度,并使用它打印出一个二维网格,然后我可以稍后使用它进行修改等等

我有一个解决方案,我认为可能会解决它,但我不知道如何实施它。我相信为了解决这个问题,我需要将malloc border作为**,然后将行malloc作为*

尝试以下方法:

    void display_grid(struct game_board *M, FILE *stream) {
        int i, j;

        /* malloc memory for appropriate amount of rows */
        M->border = malloc(sizeof(*M->border) * (M->width + 4));


        for (i = 0; i <= M->width; i+=2){
            M->border[i] = M->border[M->width + 1] = '+';
            for (j = 1; j <= M->width; j+=2){
                M->border[j] = M->border[M->width] = ' ';
                fprintf(stream, "%c\n", M->border[i][j]);
            }
        }
        M->border[M->width + 2] = '\0';

        fflush(stream);
   }
不要尝试任何更复杂的事情,除非你能完全理解它,并且完全理解它。

试试这个:

    void display_grid(struct game_board *M, FILE *stream) {
        int i, j;

        /* malloc memory for appropriate amount of rows */
        M->border = malloc(sizeof(*M->border) * (M->width + 4));


        for (i = 0; i <= M->width; i+=2){
            M->border[i] = M->border[M->width + 1] = '+';
            for (j = 1; j <= M->width; j+=2){
                M->border[j] = M->border[M->width] = ' ';
                fprintf(stream, "%c\n", M->border[i][j]);
            }
        }
        M->border[M->width + 2] = '\0';

        fflush(stream);
   }

不要尝试任何更复杂的事情,直到你完全理解它,并完全理解它。

等等。。。
border
有多少个元素?它看起来像是用
width+4
构造的,但是试着读它,就像它是
width(width+1)
一样。好吧,我可能已经解决了一些问题。我最初在程序开始时将border声明为结构内部的char*。在我的理解中,这反过来意味着我声明了一个1D数组。但是通过将border的声明更改为char**,我现在将其声明为2D数组。这是否准确?您似乎对数组的工作方式有误解。简而言之,声明一个指针和构造一个数组是完全不同的事情。较长的答案是,我建议您单独使用阵列(即,不作为结构或复杂项目的一部分),直到您可以轻松处理1D或2D(或更高版本),然后将它们合并到其他代码中。
char**a
不是2D阵列!设置和使用比使用合适的二维阵列更复杂。我同意@Beta。你真的应该在开始跑步之前先学会走路。结构游戏板的定义是什么?等等。。。
border
有多少个元素?它看起来像是用
width+4
构造的,但是试着读它,就像它是
width(width+1)
一样。好吧,我可能已经解决了一些问题。我最初在程序开始时将border声明为结构内部的char*。在我的理解中,这反过来意味着我声明了一个1D数组。但是通过将border的声明更改为char**,我现在将其声明为2D数组。这是否准确?您似乎对数组的工作方式有误解。简而言之,声明一个指针和构造一个数组是完全不同的事情。较长的答案是,我建议您单独使用阵列(即,不作为结构或复杂项目的一部分),直到您可以轻松处理1D或2D(或更高版本),然后将它们合并到其他代码中。
char**a
不是2D阵列!设置和使用比使用合适的二维阵列更复杂。我同意@Beta。你真的应该在开始跑步之前先学会走路。struct game_board的定义是什么?