【发布时间】:2017-09-17 10:00:59
【问题描述】:
我试图实现一个基本程序,它在共享内存中写入一个字符串数组,然后从那里读取它。我经常遇到分段错误。我真的不知道出了什么问题(我真的搞砸了),因为我是第一次使用共享内存。任何帮助将不胜感激,谢谢!
代码:
#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]的值保存在共享内存中。
【问题讨论】:
-
讽刺的是你的名字是段错误。
-
@AjayBrahmakshatriya 我在内存管理方面真的很糟糕! :)
-
首先检查 shmget 和 shmat 错误返回值(阅读手册页了解详细信息)。返回值正常吗? (一般来说,在缺乏基本错误检查的代码上调试错误是没有意义的。)
-
@hyde 我已经尝试过了,但是我在 shmget 上遇到了分段错误,所以我无法真正检查它返回的内容..
-
贴出的代码编译不干净!编译时,始终启用所有警告,然后修复这些警告。 (对于
gcc,至少使用:-Wall -Wextra -pedantic我也使用:-Wconversion -std=gnu11)
标签: c arrays string memory-management segmentation-fault