C: shmget с двумерным массивом - PullRequest
2 голосов
/ 21 марта 2012

Я пытаюсь использовать shmget с 2D-массивом.Это мой код:

char **array;
key_t key;
int size;
int shm_id;
int i = 0;
void *addr;

key = // here I get the key with ftok()
size = (21 * sizeof(char *)) + (21 * sizeof(char **));
shm_id = // here I get the shmid with shmget()

if (shm_id == -1) // Creation
{
     array = (char **)shmat(shm_id, NULL, SHM_R | SHM_W);
     while (i != 20)
     {
         array[i] = memset(array[i], ' ', 20);
         array[i][20] = '\0';
         i++;
     }
     array[i] = NULL;
     shm_id = // here I get the shmid with the flag IPC_CREAT to create the shared memory
     addr = shmat(shm_id, NULL, SHM_R | SHM_W);
}

Но у меня ошибка сегментации со строкой "array [i] = memset (array [i], '', 20);"

Что я делаю не так?

1 Ответ

2 голосов
/ 21 марта 2012

Вы должны сначала проверить, успешно ли работает shmget. если распределение общей памяти не удается, то вы не можете использовать общую память! ;-) Как:

If ( shm_id = shmget(.......) == -1) {
exit(1);
}
else {
/* proceed with your work*/
}

и то же самое для shmat.

shmget возвращает void *. Вы не можете присвоить его символу ** и использовать его как массив 2d. Фактически, char * может быть легко обработан как 2D массив логически.

...