我试图实现一个基本程序,它在共享内存中写入一个字符串数组,然后从那里读取它。我经常采取分段错误。我真的不知道出了什么问题(我真的搞砸了)因为我第一次使用共享内存。任何帮助将不胜感激,谢谢!
代码:
#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]值保存在共享内存中。
答案 0 :(得分:3)
分段错误似乎与使用共享内存无关。 实际上你在这里声明的是(*数组)[100] [50]是指向2D数组的指针。但是在访问它时,您将其视为普通的2D数组变量。 因此,如果你像(* array)[i]那样访问它,那么就没有内存违规。
*数组指向2D数组,而数组只是指向数组的指针的位置。 你可以尝试像(* array)[i]那样填充数组,然后尝试在循环中打印array [i]。第一个元素,即数组[0]将是有效的,因为索引0将只是打印*数组。 但是从索引1开始,它将尝试访问可能不是有效位置的位置*(数组+ 1)。这会导致分段错误。 但是(* array)[i]表示访问有效的位置(* array)+ 1,因为数组是在传染性内存位置分配的