2010-03-24 6 views
3

에서 파이프를 통해 동적 배열 구조체를 판독 :작성 및 I는 그 안에 동적 배열 구조체가 C

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

및 I이 전달하고자하는 C와 링 주위에 파이프를 구조체 프로세스의. 각 프로세스에서 count 값을 변경하면 올바르게 변경됩니다. 내 문제는 동적 배열입니다.

나는 같은 배열을 할당하고있다 :

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 배열을 씁니다.