【发布时间】:2017-11-18 23:21:26
【问题描述】:
在我的完整程序中出现“分段错误”之后,我在 Linux 中使用共享内存(没有多个进程)编写了一个简单的 c 程序。
我仍然遇到同样的错误。我做错了什么?
谢谢!
#include<stdio.h>
#include<stdlib.h>
#include<sys/shm.h>
#include<sys/ipc.h>
#include<sys/types.h>
void sys_err(char s[])
{
perror(s);
exit(1);
}
int main(int argc, char *argv[])
{
int shmid, *shmptr, *ptr;
if(shmid = shmget(IPC_PRIVATE, (10)*sizeof(int), 0666|IPC_CREAT)<0)
sys_err("Cannot shmget");
if((shmptr=(int*)shmat(shmid,0,0))<(int*)0)
sys_err("Cannot shmat");
shmptr[0]=1; // <----- error: "Segmentation fault (core dumped)"
//OR
*shmptr=1; // <----- error: "Segmentation fault (core dumped)"
//OR
ptr=shmptr; // <----- error: "Segmentation fault (core dumped)"
*ptr=1;
if(shmdt(shmptr)<0)
sys_err("Cannot shmdt");
shmctl(shmid,IPC_RMID,0);
return 0;
}
【问题讨论】:
-
我不知道这是问题所在,但这是 a 问题:当您将
shmat的结果与< (int *) 0进行比较时,您正在调用 实现特定的行为,可能会也可能不会。而是与-1(即== (int *) -1)比较是否相等。 -
作为我之前评论的补充,指针本身实际上只是 unsigned 整数。我不知道 C 规范对此有何评论,但检查指针是否小于零并不是我认为有效的操作(因为根据定义,指针不能为负数)。与
-1(转换为指针)的直接相等比较虽然很好。 -
编译时出现警告,一切都会变得清晰。
shmid = shmget(...)<0没有做你认为的事情。用 ' -
我试过了。它不起作用。谢谢!
-
请考虑
shmptr可能小于0的所有可能情况。有:0。您没有正确检查该错误。
标签: c linux segmentation-fault shared-memory coredump