3

我有一个内部带有动态数组的结构:

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

我想将这个结构传递到 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 ) );
4

3 回答 3

1

你只是在写结构。如果要传递整数数组,也必须将其写入管道。这就是您的第二个选项有效的原因,因为数组被指定为结构的一部分。

于 2010-03-24T05:22:52.833 回答
1

在动态情况下,您的结构不包含数组本身,仅包含指向它的指针。(如果您检查 sizeof(mystruct_t),您可以看到它仅大到足以包含一个 int 和一个指针)。

您不能(有意义地)将指针从一个进程写入另一个进程。

如果要复制可变大小的数组,则必须执行 2 次写入操作:第一次将写入 mystruct.count,第二次将写入整数数组。

于 2010-03-24T05:24:19.150 回答
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};
于 2010-03-24T05:29:23.287 回答