im试图实现一个基本程序,该程序在共享内存中写入一系列字符串,然后从那里读取它。我不断地遇到细分故障。我真的不能说出了什么问题(我真的把它弄乱了(,因为我第一次使用共享记忆。任何帮助将不胜感激,谢谢!
代码:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <sys/wait.h>
#include <unistd.h>
#include <string.h>
int main(int argc, char *argv[])
{
int shmid;
int i = 0;
key_t key = 123;
char (*array)[100][50];
shmid = shmget(key, 100 * 50, IPC_CREAT | 0666);
array = (char *)shmat(shmid, 0, 0);
// array = malloc(sizeof(int)*count);
for (i = 0; i < 10; i++)
{
strcpy(array[i], "arrayvalues");
}
for (i = 0; i < 10; i++)
{
printf("n%s---n", array[i]);
}
printf("nWritting to memory succesful[+]n");
shmid = shmget(key, 1024, IPC_CREAT | 0666);
array = (char *)shmat(shmid, 0, 0);
for (i = 0; i < 9; i++)
{
printf("n%s---n", array[i]);
}
printf("nRead to memory succesful[+]n");
shmdt((void *)array);
// shmctl(shmid, IPC_RMID, NULL);
return 0;
}
编辑:它仅将数组[0]值保存在共享内存中。
看来分割故障与使用共享内存无关。实际上,您在这里声明的内容(*数组([100] [50]是指向2D数组的指针。但是,在访问相同的同时,您将其视为普通的2D数组变量。因此,如果您像(*array([i]访问它,则不会违反内存。
*数组指向2D数组,而数组只是指向数组的指针的位置。您可以尝试像(*array([i]这样的数组填充数组,然后尝试在循环中打印数组[i]。第一个元素即阵列[0]将有效,因为索引0除了打印 *数组,其意义不大。但是从索引1开始,它将尝试访问位置 *(数组 1(,这可能不是有效的位置。这会导致分割故障。但是(*array([i]是指有效的访问位置(*array( 1,因为在传染性内存位置分配了数组