2012-03-09 26 views
1

私は共有メモリプログラムを書いています。共有メモリプログラムを書くと、片面にメモリが作成され、そのメモリに構造体が書き込まれ、その構造体が他のプログラムから読み込まれます。私の問題は、構造体を共有メモリにコピーすることはありません。セグメンテーションフォルトを取得せずに、構造体にシンプルなvairiableをコピーするだけです。誰も私を少し助けてくれる?おかげ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にポイントをPDATAもののサイズが初期化されていないされ、そしてsizeOfCompanyInfoが間違って初期化され

size_t sizeOfCompanyInfo = sizeof(*pdata); 

を意味します。これを試してみてください:言っ

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

が、私はおそらくだけではなく、sizeOfCompanyInfoのsizeof *pdataを使用します。それは読書と同じように、変数を1つ少なくし、間違ったことを少なくします。

+0

私はまだ – kev670

+0

とその2つの行から来るセグメンテーションフォールトを得ています – kev670

+0

struct companyInfo * pdata = NULL; – kev670

3

あなたが

+0

ありがとうございます。あなたはなぜ私がstrcpyの値をsrtructに入れたのか教えてもらえますか? – kev670

+0

haraldの答えは正しいパターンです - それは構造体へのポインタとして扱われるメモリのブロックを指すように設定されています。おそらく株価を設定するつもりです。 – djna