2010-03-24 71 views
3

讀取與動態數組結構我有一個動態數組的結構體在它的內部:寫入和通過管道用C

struct mystruct { 
int count; 
int *arr; 
} mystruct_t; 

和我想通過在C和周圍的環結構向下的管的過程。當我在每個過程中更改計數值時,它會正確更改。我的問題是動態數組。

我分配數組作爲這樣的:

mystruct_t x; 
x.arr = malloc(howManyItemsDoINeedToStore * sizeof(int)); 

每個過程應該從管道中讀取,做一些該數組,然後將其寫入到另一個管道。戒指設置正確;那裏沒有問題。我的問題是除第一個以外的所有進程都沒有獲得數組的正確副本。我在第一個過程中將所有值初始化爲10,例如,然而,它們在隨後的顯示爲0。

for(j = 0; j < howManyItemsDoINeedToStore; j++){ 
    x.arr[j] = 10; 
} 

登錄:

Initally:  10  10  10  10  10 
After Proc 1: 9  10  10  10  15 
After Proc 2: 0  0  0  0  0 
After Proc 3: 0  0  0  0  0 
After Proc 4: 0  0  0  0  0 
After Proc 5: 0  0  0  0  0 
After Proc 1: 9  10  10  10  15 
After Proc 2: 0  0  0  0  0 
After Proc 3: 0  0  0  0  0 
After Proc 4: 0  0  0  0  0 
After Proc 5: 0  0  0  0  0 

現在,如果我改變我的代碼,比方說,

struct mystruct { 
int count; 
int arr[10]; 
} mystruct_t; 

一切都正確傳下來的管道,沒有問題。我使用C中readwrite

write(STDOUT_FILENO, &x, sizeof(mystruct_t)); 
read(STDIN_FILENO, &x, sizeof(mystruct_t)); 

回答

1

當你分配你的動態數組malloc函數給出一個指向不在你的結構中的內存空間的指針。看看這個例子:

0x0000000F int count 
0x00000014 >> pointer to your array elsewhere 0x000000F0 


0x000000F0 your array is here 

你可以使用衆所周知的數據填充你的結構來演示它。

struct mystruct{ 
    int count; 
    int *arr; 
    char pad [5]; 
}mystruct_t; 
mystruct_t x; 
x.pad={0x5b,0x5C,0x5D,0x5E,0x5F}; 
1

你只是寫結構。如果你想傳遞整數數組,你必須把它寫到管道中。這就是爲什麼你的第二個選項正在工作,因爲數組被指定爲結構的一部分。

1

在動態情況下,你的結構體不包含數組本身,只是一個指向它的指針。 (如果你檢查sizeof(mystruct_t),你可以看到它只包含一個int和一個指針)。

您不能(有意義地)將指針從一個進程寫入另一個進程。

如果你想複製一個可變大小的數組,你將不得不做2次寫操作:第一次寫mystruct.count,第二次寫入int數組。