我正在使用共享内存,因此我需要将一部分内存附加到其他进程。 我试图附加到一个连续的序列,但这似乎在整数和浮点数组后工作。 这里有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之后不连续。为什么会这样?解决方案是什么?
答案 0 :(得分: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)
的值。如果它是无意的,那就是答案。如果不是,那么,知道这个firstname
和lastname
变量对我们提供更好的答案是有用的。
UPD:另请注意,在i≥0时,您要打印未初始化的array1和array2项。
答案 1 :(得分:0)
您只是初始化array1
和array2
的第一个字段,其余字段未初始化。你好像有些困惑,但我不确定你的目的是什么。
如果你想让两个数组成为char *
,那很简单,就像你为整数和浮点数做的那样。
但是,如果你真的想要char*[]
之类的东西,你不仅需要存储值,还需要存储指向共享内存段中值的指针。