-4
フルプログラムで「セグメンテーションエラー」が発生した後、Linuxで共有メモリを使用したシンプルなCプログラムを作成しました。Linuxで共有メモリを使用する場合のセグメンテーションフォールト(コアダンプ)の修正方法
まだ同じエラーが発生します。私は何を間違えたのですか?
ありがとうございます!
#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')と等しいかどうかを比較してください。 –
私の前回のコメントの補足として、ポインタ自体は実際には*符号なし*整数です。私はCの仕様が何を言っているのかわかりませんが、ポインタがゼロよりも小さいかどうかを確認する操作は、(ポインタが定義されていれば負であってはいけないので)有効であると考えられます。 '-1'(ポインタにキャスト)との直接の等価比較はすべてうまくいっています。 –
警告でコンパイルするとすべてがクリアになります。 'shmid = shmget(...)<0'は、あなたが思うことをしません。また、 '<'で戻り値をチェックすることも悪い考えです。 – Art