在C中通过管道读写动态数组结构

在C中通过管道读写动态数组结构,c,arrays,pipe,dynamic-arrays,C,Arrays,Pipe,Dynamic Arrays,我有一个结构,里面有一个动态数组: struct mystruct { int count; int *arr; } mystruct_t; 我想把这个结构传递到C中的一个管道中,并绕过一个进程环。当我在每个进程中更改count的值时,它被正确地更改。我的问题是动态数组 我正在按如下方式分配阵列: mystruct_t x; x.arr = malloc( howManyItemsDoINeedToStore * sizeof( int ) ); 每个进程都应该从管道中读取数据,对该数组

我有一个结构,里面有一个动态数组:

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;
}
现在,如果我把代码改成

struct mystruct {
 int count;
 int arr[10];
} mystruct_t;
一切都正确地通过管道,没问题。我在C语言中使用
read
write

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

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

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

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


如果要复制一个大小可变的数组,必须执行两个写操作:第一个写mystruct.count,第二个写int数组

当您alloc动态数组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};
struct mystruct{
  int count;
  int *arr;
  char pad [5];
}mystruct_t;
mystruct_t x;
x.pad={0x5b,0x5C,0x5D,0x5E,0x5F};