我有两个结构是密切相关的,所以我希望一个结构参考另一个。就像这样:
//inside maze.h
typedef struct{
char * maze;
int height, length, cols, rows;
} maze_t;
//inside walker.h
typedef struct {
int row, col, end_row, end_col, dir, origin;
maze_t * maze;
} walker_t;但这是我的问题:当我想打印字符串走行器->迷宫->迷宫,我得到一个分割错误。这是很多代码,但我不知道我是在哪里出错的。分割错误发生在move_walker函数中。
我的代码:
麦泽克:
#include "maze.h"
#include "string.h"
#include "stdio.h"
#include "stdlib.h"
/* Incomplete definitions of the maze support function . */
void init_maze(maze_t* maze, FILE * pFile) {
int result;
// obtain file size:
fseek(pFile , 0 , SEEK_END);
int lSize, stringPtr;
lSize= ftell(pFile);
rewind (pFile);
// allocate memory to contain the whole file:
char* string = malloc (sizeof(lSize);
if (string == NULL) {fputs ("Memory error",stderr); exit (2);}
// copy the file into the buffer:
result = fread (string,1,lSize,pFile);
if (result != lSize) {fputs ("Reading error",stderr); exit (3);}
fclose(pFile);
maze->maze = malloc (strlen(string) + 1);
stringPtr = find_letter_in_string('\n', string);
strcpy(maze->maze, &string[stringPtr+1]);
maze->rows = atoi(string);
stringPtr = find_letter_in_string(',', string);
maze->cols = atoi(&string[stringPtr+1]);
printf("Maze has %d rows and %d columns \n", maze->rows, maze->cols);
return;
}步行者:
#include "maze.h"
#include "walker.h"
#include "stdlib.h"
#include "stdio.h"
walker_t* init_walker(maze_t * maze) {
walker_t* walker = malloc(sizeof(walker_t));
walker->dir = 0;
printf("Made room for walker.\n");
walker->maze = maze;
locate(maze, 'S',&walker->row, &walker->col);
printf("Start coordinates: %d, %d.\n", walker->row, walker->col);
locate(maze, 'E',&walker->end_row, &walker->end_col);
return walker;
}
int move_walker(walker_t * walker, int row, int col) {
printf("maze: %s", walker->maze->maze);
printf("check: %d\n", check_move(walker->maze, row, col));
if(! check_move(walker->maze, row, col)){
printf("hello world");
return 0;
}
walker->row = row;
walker->col = col;
return 1;
}C.主要:
maze = malloc( sizeof (maze_t));
FILE * pFile = fopen(argv[1],"r");
if(pFile == NULL){
printf("No such file!\n");
return 0;
}
init_maze(maze, pFile);
printf("Scrambled the maze.\n");
walker = init_walker(maze);
printf("Woken the walker.\n");对不起,拼写错误等等,我有阅读障碍,旁边的事实是,这不是我的母语。
发布于 2014-02-24 11:22:23
至少这部分是错误的:
result = fread (string,1,lSize,pFile);
// …
maze->maze = (char*)malloc (strlen(string) + 1);fread不NUL-终止string,因此不能可靠地在其上使用strlen,因为它查找终止的'\0',因此继续在分配的缓冲区之外扫描。在本例中,result实际上包含读取的字节数,您可以使用string[result] = '\0'终止字符串,或者直接使用fgets读取。strlen本身是不必要的,因为您已经知道读取的字节数。
在这两种情况下,您还需要为string中的NUL再分配一个字节。
char* string = malloc(lSize + 1);sizeof(char) (总是1)的乘法和对char *的转换也可以删除,以获得更好的样式,如图所示。
https://stackoverflow.com/questions/21986152
复制相似问题