我正在尝试使用共享内存和我在这里展示的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;
}
解决方案是什么?
答案 0 :(得分:2)
问题很可能不你认为它是什么,而是你的数组。数组数组不与指针指针相同。
阵列是连续的存储区域,并且阵列阵列是连续区域的连续区域,即所有阵列彼此跟随。指向指针的指针可以看作指针数组,内存布局完全不同。
此外,只有指针数组是共享的,而不是指针实际指向的位置。