2012-03-09 2 views
1

Я пишу программу общей памяти, которая с одной стороны создаст кусок памяти и напишет структуру, а затем прочитает эту структуру из другой программы. Моя проблема заключается в том, что я не могу просто скопировать симуляцию в структуру без получения ошибки сегментации, которая никогда не копирует структуру в общую часть памяти. Может кто-нибудь помочь мне немного. БлагодаряПроблемы с разделением памяти C

#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> 


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

int main() 
{ 
    key_t key = 1234; 
    int shmid; 
    char* smPtr = NULL; 
    int i = 1; 
    struct companyInfo * pdata; 
    size_t sizeOfCompanyInfo = sizeof(pdata); 

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

    size_t sizeMem = sizeOfCompanyInfo*5; 

    shmid = shmget(key, sizeMem, 0644 | IPC_CREAT); 

    smPtr = (char*) shmat(shmid, (void*) 0, 0); 

    char bank[100] = "AIB"; 

    strcpy(pdata->companyName, bank); 


} 
+0

pdata кажется неинициализированным на последней строке. –

ответ

1

pdata не инициализирован, и sizeOfCompanyInfo инициализируется неправильно. Попробуйте это:

struct companyInfo * pdata; 
size_t sizeOfCompanyInfo = sizeof *pdata; 
... 
shmid = shmget(....); 
pdata = shmat(shmid, NULL, 0); 
strcpy(pdata->companyName, "Hello there"); 

То есть, я бы, наверное, просто использовать sizeof *pdata вместо sizeOfCompanyInfo. Он так же читабельен, и делает его менее переменным, и еще одно, что может быть неправильным.

+0

Я все еще получаю ошибку сегментации, хотя – kev670

+0

и ее ближайшие из этих двух строк – kev670

+0

struct companyInfo * pdata = NULL; – kev670

3

Вы имеете в виду

size_t sizeOfCompanyInfo = sizeof(*pdata); 

То есть размер, что указывает на PDATA

+0

Спасибо. Можете ли вы рассказать мне, почему я strcpy значение в srtruct, хотя – kev670

+0

Ответ на харалд является правильным шаблоном - pdata настроен на то, чтобы указывать на блок памяти, который вы затем обрабатываете как указатель на структуру и копируете в отдельных значениях - вы вероятно, намерены также установить цену акций. – djna

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