2013-09-15 4 views
0

Мой процесс имеет доступ к общей памяти, которая уже создана. Указатель, прикрепленный к общей памяти, представляет собой структуру, содержащую указатель и 2 или 3 переменные.Общая память в C

например:

typedef struct _info_t{ 
    int id; 
    char c; 
}info_t; 

typedef struct _details_t{ 
    int buff_id; 
    info_t* info; 
}details_t; 

details_t* details = shmat(shmid,(void*)0,0); 
printf("\n %d \n",details->info->id);   // gives me a segmentation fault 
+0

Это не только C, это C * и * Linux (или, по крайней мере, Posix!). Поэтому, пожалуйста, добавьте еще теги ... –

+1

'* details' определен, но' * details-> info' нет. – Dave

+1

Дейв прав. Проблема в том, что вы не выделили место для 'details-> info', поэтому следующий разыгрыш' -> id' завершился неудачно. Это не имеет ничего общего с разделяемой памятью. – UncleO

ответ

4

Если сегмент памяти распределяется между более чем одним процессом, нет никакой гарантии, что будет отображаться на тот же адрес, так что вы можете не хранить указатели в сегменте разделяемой памяти. Старайтесь избегать использования указателей, используйте смещения или массивы (если это возможно).

1

shmat(2) является syscall (на Linux). Он может потерпеть неудачу. Так, по крайней мере код

details_t* details = shmat(shmid,(void*)0,0); 
if (!details) { perror("shmat"); exit(EXIT_FAILURE); }; 

и вы не можете положить (легко) указатели в общей памяти, так как адрес специфичен для каждого процесса.

Смежные вопросы