Сохранение массива структур в разделяемую память

Я пытаюсь создать часть общей памяти, которая содержит массив структур. В моем текущем коде, когда я запускаю его, я получаю ошибку сегментации. Я думаю, что мне, возможно, придется использовать memcpy, но на данный момент я сильно застрял. Любая помощь будет оценена по достоинству...

#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/shm.h>
#include <unistd.h>
#include "header.h"


int main()
{
    key_t key = 1234;
    int shmid;
    int i = 1;

    struct companyInfo * pdata[5];

    strcpy(pdata[0]->companyName,"AIB");
    pdata[0]->sharePrice = 11.02;
    strcpy(pdata[1]->companyName,"Bank Of Ireland");
    pdata[1]->sharePrice = 10.02;
    strcpy(pdata[2]->companyName,"Permanent TSB");
    pdata[2]->sharePrice = 9.02;
    strcpy(pdata[3]->companyName,"Bank Od Scotland");
    pdata[3]->sharePrice = 8.02;
    strcpy(pdata[4]->companyName,"Ulster Bank");
    pdata[4]->sharePrice = 7.02;



    int sizeOfCompanyInfo = sizeof(struct companyInfo);

    int sizeMem = sizeOfCompanyInfo*5;

    printf("Memory Size: %d\n", sizeMem);

    shmid = shmget(key, sizeMem, 0644 | IPC_CREAT);
    if(shmid == -1)
    {
        perror("shmget");       
        exit(1);
    }

    *pdata = (struct companyInfo*) shmat(shmid, (void*) 0, 0);
    if(*pdata == (struct companyInfo*) -1)
    {
        perror("schmat error");
        exit(1);
    }

    printf("name is %s and %f . \n",pdata[0]->companyName,pdata[0]->sharePrice);

    exit(0);

}

файл header.h выглядит следующим образом...

struct companyInfo
{
    double sharePrice;
    char companyName[100];
}; 

person kev670    schedule 11.03.2012    source источник
comment
Где в вашем коде возникает ошибка seg? Можете ли вы пройти через отладчик или даже просто ввести операторы printf(), чтобы увидеть, по крайней мере, где происходит сбой?   -  person chrisaycock    schedule 12.03.2012
comment
Кажется, мне не нравится присваивать значения массиву, когда я strcpy в pdata[1] возникает ошибка сегментации. я нашел это, бросив printfs   -  person kev670    schedule 12.03.2012
comment
Тогда это звучит так, как будто pdata[1] не был инициализирован должным образом. К счастью, ниже есть пара ответов, которые объясняют, как это исправить.   -  person chrisaycock    schedule 12.03.2012
comment
У вас есть два ответа, которые указывают на проблему. Я бы принял ответ hmjd, потому что он более полный и содержит код.   -  person Carey Gregory    schedule 12.03.2012


Ответы (2)


struct companyInfo * pdata[5];

содержит массив из 5 неинициализированных указателей. Вам нужно также выделить память для каждого элемента в массиве перед их использованием:

for (int i = 0; i < 5; i++)
{
    pdata[i] = malloc(sizeof(companyInfo));
}

или просто объявите массив struct companyInfo, так как в динамическом размещении нет необходимости:

struct companyInfo pdata[5];
person hmjd    schedule 11.03.2012
comment
Спасибо. использование malloc очень помогло и избавило от ошибки сегментации. - person kev670; 12.03.2012
comment
К сожалению, это не заставляет работать с общей памятью. ">stackoverflow.com/questions/9660503/ - person blueshift; 12.03.2012

pdata — это таблица указателей, поэтому вам нужно создать каждый struct companyInfo с помощью malloc, прежде чем вы сможете получить к ним доступ.

person UmNyobe    schedule 11.03.2012