c - 警告 : assignment from incompatible pointer type

标签 c arrays pointers struct

<分区>

编译以下代码时,我收到警告:

warning: assignment from incompatible pointer type
maze->mazeValue = mazeValue;

这是解迷宫的代码。已经尝试过,但无法确定问题所在。如果我将
char mazeValue[BUFFERSIZE][BUFFERSIZE] 更改为 char\*\* mazeValue**,程序会编译但不会执行。 Windows 抛出警报。

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

#define BUFFERSIZE (1000)
#define MAZE_ENTRANCE '.'


struct maze {
    char ** mazeValue;
    int startx, starty;
    int numrows;
    int initdir;
};

void ReadMaze(struct maze * maze);

int main(int argc, char *argv[]) {
    struct maze maze;


    ReadMaze(&maze);
    printf("Thanks");
    //PrintStage(&maze);

    return EXIT_SUCCESS;
}


/*  Creates a maze from a file  */

void ReadMaze(struct maze * maze) {
    char buffer[BUFFERSIZE];
    char  mazeValue[BUFFERSIZE][BUFFERSIZE];
    //char workingMaze [BUFFERSIZE][BUFFERSIZE];
    //char ** map;
    int rows = 0, foundentrance = 0, foundexit = 0;
    int columns = 0, i = 0;

    /*  Determine number of rows in maze  */


    while ( fgets(buffer, BUFFERSIZE, stdin) ){

       //puts(buffer);
       columns = strlen(buffer);

       /*
       for(i=0; buffer[i] != '\0'; i++)
       {
            //printf("Row: %d\n", rows);
            //putchar(buffer[i]);
            //printf("\n");
            mazeValue[rows][i] = buffer[i];
            //putchar(mazeValue[rows][i]);
            //printf("\n");
       }
       */

       strcpy(mazeValue[rows], buffer);

       for ( i = strlen(mazeValue[rows]) - 1; isspace(mazeValue[rows][i]); --i )
            mazeValue[rows][i] = 0;

        /*  Check for entrance and save the location if it finds  */

        if ( !foundentrance && rows == 0) {
            i = 0;

            printf("rows %d\n", rows );
            printf("i %d\n", i );

            while ( mazeValue[rows][i] != MAZE_ENTRANCE && mazeValue[rows][i++] ){

                if ( mazeValue[rows][i] == MAZE_ENTRANCE ) {
                    maze->startx = i;
                    maze->starty = rows;
                    foundentrance = 1;
                }
            }
        }
        ++rows;
    }

    maze->mazeValue = mazeValue;
    maze->numrows = rows;

    printf("maze->startx %d\n", maze->startx);
    printf("maze->starty %d\n", maze->starty );

    printf("\n");
    printf("Stage 1\n");
    printf("=======\n");
    printf("maze has %d rows and %d columns\n\n", rows, columns);

    i=0;
    int j;

    for(i=0; i<=rows; ++i)
    {
        for(j=0; j<=columns; ++j){
            printf("%c", mazeValue[i][j]);
            printf("%c", mazeValue[i][j]);
        }
        printf("\n");
    }

    printf("\n");
    printf("foundentrance: %d\n", foundentrance);

}

最佳答案

即使作业有效,您也不能那样做。您正在尝试存储一个本地数组,并在以后使用它,这是不允许的,并且会给您带来未定义的行为。

您需要堆分配(使用 malloc())结构内的数据,而不是使用本地数组。

首先将结构体成员改成普通字符指针:

char *mazeValue;  /* Single-star! */

然后像这样分配它:

maze->mazeValue = malloc(BUFFERSIZE * BUFFERSIZE);

然后自己做二维索引,就容易多了:

maze->mazeValue[y * BUFFERSIZE + x] = '?';

当然 xy 必须都在 0BUFFERSIZE - 1 之间。

注意:如果您真的希望 BUFFERSIZE 保持不变,您可以直接在结构中声明数组,回到二维数组:

char mazeValue[BUFFERSIZE][BUFFERSIZE];

关于c - 警告 : assignment from incompatible pointer type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37317895/

相关文章:

c++ - C/C++ : Pointer Arithmetic

c - list_empty函数内核链表

c - OS X Yosemite 上的堆栈崩溃?

javascript - 转换对象结构数组

C# 根据键数组按属性对数组进行排序

c++ - 使用指针访问struct c++ vector 中的元素

c - 如何使指向全局结构数组的指针

c - 链表在开头打印额外的 0

c++ - 在静态库(C++、Eclipse CDT)中使用#ifdef

javascript - 在 JavaScript 中合并两个对象 (NodeList) 数组