我想使用 IPC 将共享内存分配为二维数组。我尝试了以下方法:
id_shmem = shmget(ipc_key, sizeof(int)*rows*columns, IPC_CREAT|0666);
matrix = (int **)shmat(id_shmem, 0, 0);
问题是,每当我尝试将某些内容写入矩阵时,都会出现段错误。
我想使用 IPC 将共享内存分配为二维数组。我尝试了以下方法:
id_shmem = shmget(ipc_key, sizeof(int)*rows*columns, IPC_CREAT|0666);
matrix = (int **)shmat(id_shmem, 0, 0);
问题是,每当我尝试将某些内容写入矩阵时,都会出现段错误。
int** 不是二维数组,而是一个指针数组。您不应该将指针存储在共享内存中,因为共享内存段可能会在不同进程中分配到不同的地址。尝试使用简单、平坦的一维数组,它会用一些索引魔法“模拟”二维数组,即。
x,y -> y*width+x
共享内存中结构的常见做法是存储偏移量而不是指针。这是为了绕过这样一个事实,即内存可以映射到不同进程中的不同虚拟地址。
另一种常见的方法是首先让进程请求操作系统提供的映射,然后以某种方式将生成的虚拟地址传递给需要附加到同一内存的所有其他进程,并让它们在该地址请求固定映射。