2011-03-09 106 views
3

我想創建一塊共享內存,以便共享一個數組,這裏是我的例子:C++:數組和共享內存

int main(){ 
    key_t key; 
    int shm_id; 
    int arr[10]; 

    key=ftok("~/.bashrc",1); 

    shm_id = shmget(key, 10*sizeof(int), 0666 | IPC_CREAT); 

    arr = (int*)shmat(shm_id, NULL, 0); 

    arr[0]=101; 
    printf("%d\n",arr[0]); 


} 

編譯時,我得到以下錯誤:

error: incompatible types in assignment of ‘int*’ to ‘int [10]’ 

我的任務有什麼問題?

+0

這是更好,當你需要他們直接創建變量。 – Andrew

回答

2

刪除此行:

int arr[10]; 

和改變呼叫到SHMAT()來:

int* arr = (int*)shmat(shm_id, NULL, 0); 

的指針變量可以用來作爲數組,所以arr[0]=101仍然可以工作。

(如@Andrew評論,它能夠更好的在那裏他們被第一次使用點聲明變量,這樣可以減少使用未初始化變量的風險。)

+0

感謝您的提示,但如果我遵循您的建議,我會收到分段錯誤。注意:我正在像這樣編譯「g ++ test.cpp -o testCPP」 – Danilo

+0

至少它現在編譯:) segfault最可能的原因是shmat()返回一個錯誤。檢查ftok()和/或shmget()是否不返回-1(表示錯誤)。如果他們然後檢查errno的價值以尋找有關錯誤的線索。 –

+0

另外,我不確定爲什麼要爲〜/ .bashrc創建一個IPC密鑰。您可能想嘗試使用不同的(新)文件。該shell可能對該文件有某種鎖定。 –

7

你應該聲明arr爲指針,而不是數組:

int* arr; 

您可以將指針不分配到陣列和shmat()返回一個指針。

1

當您編寫arr [10]時,您將在堆棧上分配一個元素數組。隱含地,這意味着值爲& arr [0](這實際上是指向arr中第一個元素的指針),不能被改變。如果要將shmat的內容複製到數組arr中,則需要使用memcpy()或某些類似的方法來正確設置arr的內容。

+0

shmat是一個連接共享內存的unix系統函數。它不會複製任何東西。 OP正試圖將共享內存視爲一個數組 - 一種合法的技術。 –

+0

對不起,也許我不明白100%你的建議。問題是我想擁有一個放置在共享內存中的數組,以便可以通過不同的進程訪問/修改它的元素。 – Danilo

+0

@Andy:我只是想解釋arr []和arr聲明之間的重要區別,我認爲這是誤解的根源。我並不是在暗示shmat複製任何東西,我不確定爲什麼要將共享內存中的某些東西複製到堆棧變量中,但是仍然需要在堆棧數組中使用shmat()返回的內存位置的內容 - 您可以使用memcpy()。 – fnokke