0

我正在使用共享内存,因此我需要将部分内存附加到其他进程。我试图附加到一个连续的序列,但这似乎在整数和浮点数组之后不起作用。这里 NUMBER_OF_DATA=5

int shmid=shmget(key,size,0777|IPC_CREAT);
  int *a=(int *)shmat(shmid,0,0);
  float *b=(float *)(a+NUMBER_OF_DATA);
  char *array1[20];
array1[0]=(char *)(b+NUMBER_OF_DATA);
  char *array2[20];
array2[0]=(char *)(array1+(20*NUMBER_OF_DATA));
  for(i=0;i<NUMBER_OF_DATA;i++)
    {
      a[i]=roll_no[i];
      b[i]=cgpa[i];
      array1[i]=firstname[i];
      array2[i]=lastname[i];
    printf("%p %p %p %p\n",&a[i],&b[i],&array1[i],&array2[i]);
    }

当我打印地址时,我得到

0xb777d000 0xb777d014 0xbfd480a0 0xbfd480f0
0xb777d004 0xb777d018 0xbfd480a4 0xbfd480f4
0xb777d008 0xb777d01c 0xbfd480a8 0xbfd480f8
0xb777d00c 0xb777d020 0xbfd480ac 0xbfd480fc
0xb777d010 0xb777d024 0xbfd480b0 0xbfd48100

在数组 a 和 b 之后不连续。为什么会这样?解决办法是什么?

4

2 回答 2

0

好像在这一行

  array1[i]=firstname[i];
  array2[i]=lastname[i];

您正在覆盖您的值,array[i]因此它不再是指向共享内存某些部分的指针,就像在

array1[0]=(char *)(b+NUMBER_OF_DATA);
array2[0]=(char *)(array1+(20*NUMBER_OF_DATA));

在输出的最后两列中,您实际上打印的是 的值firstname[i],而不是 的值(char *)(b+NUMBER_OF_DATA)。如果是无意的,那就是答案。如果不是,那么知道 thisfirstnamelastnamevariable 是什么将有助于我们给出更好的答案。

UPD:另请注意,在 i ≥ 0 时,您正在打印 array1 和 array2 的未初始化项。

于 2013-01-26T12:37:09.107 回答
0

您只初始化 and 的第一个字段array1array2其余的未初始化。你似乎混淆了一些东西,但我不确定你的确切意图是什么。

如果您希望这两个数组为char *s,这很简单,就像您为整数和浮点数所做的那样。

但是,如果您真的想要 a 之类的东西char*[],您不仅需要存储值,还需要存储指向共享内存段中值的指针。

于 2013-01-26T12:37:23.483 回答