C 对包含数组的结构使用共享内存

C 对包含数组的结构使用共享内存,c,pointers,shared-memory,C,Pointers,Shared Memory,我正在做一个大学项目,我被要求在进程之间创建一种游戏:它们必须捕获放置在共享矩阵上的一些标志,类似于棋盘。我用一个结构和单元作为矩阵来表示电路板,但在分配共享内存段后,我无法正确连接它,因为当我尝试访问矩阵单元时,我得到了“分段错误”,事实上,我看到矩阵指针为零。那么,在分配了整个电路板之后,我如何附加矩阵 以下是我为分配/连接电路板而编写的功能代码: int allocate_board(int width, int height){ size_t size; int shm_

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

以下是我为分配/连接电路板而编写的功能代码:

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;
}
以下是我如何尝试访问board的单元格:

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

您没有数组。你有指针,使这完全不同的事情。共享内存中不能有合理的指针,句号。每个进程都有自己的内存布局,因此一个进程的指针在另一个进程中没有意义。也许您想定义您的板,以便它在最后有一个灵活的数组成员。宽度]然后。请注意,
sem\u t*
会出现类似的问题。您应该将
sem\u t
对象本身存储在共享内存中,或者使用与
board
结构分离的命名信号量。此外,您还将SysV共享内存与POSIX信号量一起使用。这本身并没有什么问题,但在风格上却令人不安。我建议改用POSIX共享内存。
game_board->width = some_width;
game_board->height = some_height;
game_board->cells[0][0].flag_score = some_score;