首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在结构内部引用结构

如何在结构内部引用结构
EN

Stack Overflow用户
提问于 2014-02-24 11:15:22
回答 1查看 165关注 0票数 1

我有两个结构是密切相关的,所以我希望一个结构参考另一个。就像这样:

代码语言:javascript
复制
//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函数中。

我的代码:

麦泽克:

代码语言:javascript
复制
#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;
}

步行者:

代码语言:javascript
复制
#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.主要:

代码语言:javascript
复制
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");

对不起,拼写错误等等,我有阅读障碍,旁边的事实是,这不是我的母语。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-24 11:22:23

至少这部分是错误的:

代码语言:javascript
复制
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再分配一个字节。

代码语言:javascript
复制
char* string = malloc(lSize + 1);

sizeof(char) (总是1)的乘法和对char *的转换也可以删除,以获得更好的样式,如图所示。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21986152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档