2012-03-09 495 views
1

我正在寫一個共享內存程序,一邊將創建一塊內存,並寫入一個結構,然後從另一個程序讀取該結構。我的問題是我似乎只是複製一個simmple可擴展到結構沒有得到一個段錯誤nevermind複製結構到共享的內存。任何人都可以幫我一點。由於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似乎在最後一行未初始化。 – 2012-03-09 17:55:06

回答

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 2012-03-09 18:13:48

+0

和它來自這兩行 – kev670 2012-03-09 18:14:47

+0

結構companyInfo * pdata = NULL; – kev670 2012-03-09 18:15:35

3

你的意思是

size_t sizeOfCompanyInfo = sizeof(*pdata); 

這是一個什麼樣pData指向

+0

謝謝。你能告訴我爲什麼我strcpy的價值進入srtruct雖然 – kev670 2012-03-09 17:59:52

+0

harald的答案是正確的模式 - pdata被設置爲指向一塊內存,然後你把它視爲一個指向結構,並複製個人價值觀 - 你可能也打算設定股價。 – djna 2012-03-09 21:21:22