Общая память для совместного использования массива с одинаковой структурой - PullRequest
0 голосов
/ 05 ноября 2011

Хорошо, посмотрите сначала, спасибо за это место :) Я хотел бы создать часть общей памяти для хранения 30 структур одного типа, но я получаю ошибки при компиляции ..

struct nota
{
    int n;
    char text[30];
    char titulo[100];
    char login[20];
}

main(){
     int shmID;
     struct nota *evernota;
     struct nota um;

     shmID = shmget(1009, sizeof(struct nota)*30 , 0666 | IPC_CREAT);

     evernota = shmat(shmID, NULL, 0);

     evernota[0] = &um;  //Declaring one note here to the first position of shm..
     evernota[20] = &um;  //Declaring the same note on the 20 position of shm..

     printf("o meu int é %d\n",evernota[0]->n);  //Here I would get the int n of each structure, that should be 0, because its not initialized..
     printf("o meu int é %d\n",evernota[20]->n);  //and there the same n, because I use the same structure on position 0 and 20..  
}

НоУ меня есть ошибки компиляции, кто-то видит, где проблема?Большое спасибо заранее !!!

Ответы [ 3 ]

1 голос
/ 05 ноября 2011

Хорошо, в этом коде много неправильного.По крайней мере, вам необходимо следующее:

 #include <sys/shm.h>
 #include <stdio.h>

Вторая проблема заключается в том, что вы вообще не инициализируете um или evernote.Это означает, что, например, evernote[0]->n будет содержать данные для мусора.Поэтому, по крайней мере, у вас должно быть, например,

um.n = 1;

Теперь возникает проблема копирования um в сегмент общей памяти.Вам необходимо скопировать содержимое памяти, определенной структурой um, в массив evernota.Для этого:

 memcpy(&evernota[0], &um, sizeof(struct nota));  
 memcpy(&evernota[20],&um,sizeof(struct nota));  

Примечание: memcpy определено в string.h.

Теперь, наконец, для печати содержимого поля n в evernota[0] вам нужноиспользуйте только оператор точки, то есть

 printf("o meu int é %d\n",evernota[20].n);  

Я думаю, это все.

РЕДАКТИРОВАТЬ: код ниже все еще дает вам segfaults?

1 голос
/ 05 ноября 2011

для начала вам нужно включить:

#include <stdio.h>
#include <string.h>
#include <sys/shm.h>

затем точка с запятой после определения структуры:

struct nota {
    ...
};

Добавить флаг IPC_EXCL, заставит shmget провалитьсяесли ключ памяти уже используется (используйте IPC_PRIVATE вместо 1009, чтобы гарантировать, что сегмент памяти новый).Тогда было бы неплохо проверить shmID != -1, и для копирования ссылок используйте memcopy:

memcpy(&evernota[0], &um, sizeof(struct nota));  
memcpy(&evernota[20], &um, sizeof(struct nota));

о printf с, используйте . вместо ->.Они будут печатать мусорные данные, они не будут автоматически инициализироваться 0 при распределении, вы должны сделать это самостоятельно.

1 голос
/ 05 ноября 2011

Переменная мм типа struct nota не инициализирована. Что вы ожидаете печатать на стандартный вывод?

Проверьте пропущенные заголовки, они должны быть как минимум:

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>

Для инициализации одного элемента массива используйте memcpy:

memcpy(&evernota[0], &um, sizeof(struct nota));

Всегда хорошо проверять возвращаемые значения системной функции:

   if ((shmID = shmget(1009, sizeof(struct nota)*30 , 0666 | IPC_CREAT) < 0) {
        perror("shmget");
        exit(1);
   }
...