警告:从不兼容的指针类型分配

时间:2016-05-19 08:31:15

标签: c arrays pointers struct

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

  

警告:从不兼容的指针类型分配
  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);

}

2 个答案:

答案 0 :(得分:2)

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

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

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

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

然后分配如下:

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

然后自己进行2D索引,这样更容易:

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

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

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

char mazeValue[BUFFERSIZE][BUFFERSIZE];

答案 1 :(得分:1)

指针有不同的类型。结构中的mazevalue是指向指针的指针。

mazevalue函数中的ReadMaze是一个二维数组。指向2D数组的指针有一种指向数组的指针,并且声明为int (*mazevalue)[BUFFERSIZE]

但是,更改结构中的指针并不能解决您的问题。 mazevalue中的ReadMaze是一个局部变量,可以在函数退出时被覆盖。在这种情况下,结构中的值可能会被覆盖。

最好的选择是保持结构相同,并更改ReadMaze函数。在这里你应该有mazevalue作为指针的指针。然后,您可以根据需要malloc 2D数组。

e.g。

void ReadMaze(struct maze * maze) {
   char  **mazeValue;

   mazevalue = malloc(BUFFERSIZE * sizeof(char*));
   for (i=0; i<BUFFERSIZE; i++)
   {
      mazevalue[i] = malloc(BUFFERSIZE);
   }
   // Other code below...

}

您还可以优化和分配应用程序所需的所需行数和列数。