首页 > 解决方案 > 将共享内存与包含数组的结构一起使用

问题描述

我正在做一个大学项目,我被要求在进程之间创建一种游戏:它们必须捕获放置在共享矩阵上的一些标志,类似于棋盘。我使用结构体和单元格作为矩阵来表示电路板,但是在分配共享内存段后,我无法正确附加它,因为当我尝试访问矩阵单元格时出现“分段错误”,实际上我看到矩阵指针是零。那么,分配整块板后如何附加矩阵呢?

这是我编写的用于分配/附加板的函数的代码:

int allocate_board(int width, int height){
    size_t size;
    int shm_id;
    key_t shm_key;
    char current_path[PATH_MAX];
    getcwd(current_path, sizeof(current_path));
    shm_key = ftok(current_path, 1);
    size = sizeof(board) + ( sizeof(cell) * height * width );
    shm_id = shmget(shm_key, size, IPC_CREAT | 0660);
    if ( shm_id < 0 ){
        printf("Cannot allocate the game board, aborting.\n");
        exit(1);
    }
    return shm_id;
}

board* get_board(int shm_id){
    void* shm_ptr;
    board* game_board;
    shm_ptr = shmat(shm_id, NULL, 0);
    if ( (int)shm_ptr == -1 ){
        printf("Cannot attach the shared memory segment, aborting.\n");
        printf("Reported error: %s.\n", strerror(errno));
        exit(2);
    }
    game_board = (board *)shm_ptr;
    return game_board;
}

这是结构定义:

typedef struct {
    entity_type_t entity_type;
    owner_id_t owner_id;
    float flag_score;
} cell;

typedef struct {
    int width;
    int height;
    sem_t* semaphore;
    cell** cells;
} board;

以下是我尝试访问董事会单元的方法:

game_board->width = some_width;
game_board->height = some_height;
game_board->cells[0][0].flag_score = some_score;

标签: cpointersshared-memory

解决方案


推荐阅读