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));

出力の最後の2列には、実際にはの値でfirstname[i]はなく、の値が出力されています(char *)(b+NUMBER_OF_DATA)。それが意図的でない場合、それは答えです。firstnameそうでない場合は、これと変数が何であるかを知ることは、lastnameより良い答えを与えるのに役立ちます。

UPD: i≥0では、array1とarray2の初期化されていないアイテムを印刷していることにも注意してください。

于 2013-01-26T12:37:09.107 に答える
0

array1との最初のフィールドのみを初期化しておりarray2、残りは初期化されていません。あなたは何かを混乱させたようですが、あなたの正確な意図がここにあるのかわかりません。

2つの配列をchar *sにしたい場合は、単純です。intとfloatの場合と同じようにします。

ただし、本当にのようなものが必要な場合はchar*[]、値だけでなく、値へのポインタも共有メモリセグメントに格納する必要があります。

于 2013-01-26T12:37:23.483 に答える