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