Сохранение массива структур в разделяемой памяти - PullRequest
1 голос
/ 12 марта 2012

Я пытаюсь создать часть общей памяти, которая содержит массив структур.В моем текущем коде, когда я запускаю его, я получаю ошибку сегментации.Я думаю, что мне может понадобиться использовать 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];
}; 

Ответы [ 2 ]

3 голосов
/ 12 марта 2012

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

3 голосов
/ 12 марта 2012
struct companyInfo * pdata[5];

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

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

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

struct companyInfo pdata[5];
...