0

ここで示した 2 つのプログラムで共有メモリを使用しようとしています。a と b は整数配列で、array1 と array2 は文字列の配列です。これは、データをメモリにロードするスニペットの最初のプログラムです。

int size = (NUMBER_OF_DATA*(sizeof(int)+sizeof(float)));
key_t key1, key2, key3;
key1 = ftok("/home/an/Desktop/newww.c", 4);
key2 = ftok("/home/an/Desktop/part1.c", 5);
key3 = ftok("/home/an/Desktop/part2.c", 6);
int shmid = shmget(key1, size, 0777|IPC_CREAT);
int shmid1 = shmget(key2, 20*NUMBER_OF_DATA, 0777|IPC_CREAT);
int shmid2 = shmget(key3, 20*NUMBER_OF_DATA, 0777|IPC_CREAT);
int *a = (int *)shmat(shmid, 0, 0);
float *b = (float *)(a + NUMBER_OF_DATA);
char **array1 = (char **)shmat(shmid1, 0, 0);
printf("array1 %p\n", &array1);
char *mempos = (char *)(array1 + NUMBER_OF_DATA); 
printf("MEMPOS %p\n", &mempos);
char **array2 = (char **)shmat(shmid2, 0, 0);
char *mempos1 = (char *)(array2 + (NUMBER_OF_DATA)); 

for(i=0; i<NUMBER_OF_DATA; i++)
{
    a[i] = a[i];
    b[i] = b[i];
    array1[i] = mempos; 
    strcpy(array1[i], array1[i]);
    mempos += 20;
    array2[i] = mempos1;
    strcpy(array2[i], array2[i]);
    mempos1 += 20;
    printf("%p  %p  %p  %p\n", &a[i], &b[i], array1[i], array2[i]);
}

j = 0;
while (j<5)
{
    j++;
    for (i=0; i<NUMBER_OF_DATA; i++)
    {
        printf("%s  %s  %d  %f\n", array1[i], array2[i], a[i], b[i]);
    }
    printf("\n");
    sleep(2);
}

上記のファイルで共有メモリにデータをロードし、以下のファイルで共有メモリの要素を変更しようとしています。しかし、以下のファイルの文字列を更新するとすぐに、変更された値ではなく、上記のプログラムからガベージ値が取得されます。私は完全に混乱しています。gdb でデバッグを試みましたが、すべて問題ないようです。

int size = (NUMBER_OF_DATA*(sizeof(int)+sizeof(float))) + (2*(20*NUMBER_OF_DATA));
key_t key1, key2, key3;
key1 = ftok("/home/an/Desktop/newww.c", 4);
key2 = ftok("/home/an/Desktop/part1.c", 5);
key3 = ftok("/home/an/Desktop/part2.c", 6);
int shmid = shmget(key1, size, 0777|IPC_CREAT);
int shmid1 = shmget(key2, 20*NUMBER_OF_DATA, 0777|IPC_CREAT);
int shmid2 = shmget(key3, 20*NUMBER_OF_DATA, 0777|IPC_CREAT);

int *a = (int *)shmat(shmid, 0, 0);
float *b = (float *)(a + NUMBER_OF_DATA);
char **array1 = (char **)shmat(shmid1, 0, 0);
printf("array1 %p\n", &array1);
char *mempos = (char *)(array1 + NUMBER_OF_DATA); 
printf("MEMPOS %p\n", &mempos);
char **array2 = (char **)shmat(shmid2, 0, 0);
char *mempos1 = (char *)(array2 + (NUMBER_OF_DATA)); 
int i;
for(i=0; i<5; i++)
{
    printf("enter\n");

    array1[i] = mempos; 
    scanf("%s", array1[i]);
    mempos += 20;
}

解決策は何ですか?

4

1 に答える 1

2

問題はおそらくあなたが考えているものではなく、配列にあります配列の配列は、ポインターへのポインターと同じではありません。

配列はメモリの連続した領域であり、配列の配列は連続した領域の連続した領域です。つまり、すべての配列は互いに続いています。ポインターへのポインターはポインターの配列と見なすことができ、メモリ レイアウトはまったく異なります。

また、ポインターの配列のみが共有されますが、ポインターが実際に指しているものは共有されません。

于 2013-01-27T11:00:13.573 に答える