在编译以下代码时,我收到警告:
警告:从不兼容的指针类型分配
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);
}
答案 0 :(得分:2)
即使作业有效,也不能这样做。您正在尝试存储本地数组,并在以后使用它,这是不允许的,并且会给您未定义的行为。
您需要对结构内的数据进行堆分配(使用malloc()
),而不是使用本地数组。
首先将结构成员更改为普通字符指针:
char *mazeValue; /* Single-star! */
然后分配如下:
maze->mazeValue = malloc(BUFFERSIZE * BUFFERSIZE);
然后自己进行2D索引,这样更容易:
maze->mazeValue[y * BUFFERSIZE + x] = '?';
当然x
和y
必须都在0
和BUFFERSIZE - 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...
}
您还可以优化和分配应用程序所需的所需行数和列数。