Вы можете сделать это с одним непрерывным сегментом разделяемой памяти. Хитрость в том, что сами значения double
находятся в общей памяти, но ваши указатели строк double *
могут быть просто обычной malloc
памятью, поскольку они являются просто индексом в общей памяти:
double *matrix_data;
double **matrix;
int x;
shmid2 = shmget(IPC_PRIVATE, numRows * numCols * sizeof matrix_data[0], IPC_CREAT | 0700);
matrix_data = shmat(shmid2, NULL, 0);
matrix = malloc(numCols * sizeof matrix[0]);
for(x = 0; x < numCols; x++)
{
matrix[x] = matrix_data + x * numRows;
}
(Обратите внимание, что это выделяет индекс в мажорном порядке столбца, как это делает ваш код, что необычно для Си - мажорный ряд более распространен).
Отдельные программы, совместно использующие сегмент общей памяти, присваивают каждому свой собственный индекс matrix
, используя malloc
- только фактический массив является общим.
Кстати, вы можете использовать тот же метод для не разделяемого массива, заменив вызов совместно используемой памяти простым malloc()
. Это позволяет вам использовать одно выделение для всего массива плюс одно для индекса, тогда как ваш код имеет одно выделение на столбец .