2016-05-11 12 views
0

私がしたいのは、私の共有メモリに "hey"と書き込むだけですが、その行にスローされます。非常に簡単なコードを次のようにデバッガが私に与え共有メモリセグメンテーションフォールトに書き込む

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#include <sys/fcntl.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/ipc.h> 
#include <sys/sem.h> 
#include <sys/shm.h> 
#define SHM_SIZE 1024 
#define FLAGS IPC_CREAT | 0644 
int main(){ 
    key_t key; 
    int shmid; 
    if ((key = ftok("ex31.c", 'k')) == -1){ 
     exit(1);}   
    if ((shmid = shmget(key, SHM_SIZE, FLAGS)) == -1) { 
      exit(1);} 
    char* shmaddr; 
    if(shmaddr=shmat(shmid,0,0) == (char*)-1){ //WRONG ARGUMENTS ?? 
      exit(0); } 
    printf("opened shared memory\n"); //gets here 
    strcpy(shmaddr, "hey");  //GETS THROWN HERE 
    printf("after writing to memory\n"); //never get here 

エラーは次のとおりです。

プログラムは、信号SIGSEGV、セグメンテーションフォールトを受けました。 0x0000000000401966 in main(argc = 1、argv = 0x7fffffffe068) ../ex31.c:449 449 strcpy(shmaddr、 "hey"); //ここに到達します

+2

'ipcs -m'の出力をポストします。 –

+0

私は恩赦ですか?出力はありません、これは私が持っているものです –

+0

コンパイルに関する警告はありますか?あなたはそれらを読んだのですか?彼らは何が間違っているのか正確に説明するべきです。 –

答えて

0

問題は演算子の優先順位です。ライン

shmaddr=shmat(shmid,0,0) == (char*)-1) 

で次に単項-演算子とキャスト演算子が最も低い優先順位を持つ=続い==続く最高の優先順位を、持っています。あなたのコードは

shmaddr=(shmat(shmid,0,0) == (char*)-1)) 

と同じであることが判明しました。それはナンセンスです。

条件の割り当ては非常に悪いプログラミング練習です。試してみると、半分くらいのコンパイラが警告を出します。演算子の優先順位の問題とは別に、=と==が混在するのは簡単です。また、=演算子は式に副作用を導入するため、他の演算子と混合すると未定義の動作が発生する可能性があります。そしておそらく最も重要なのは、内部条件を入れることは、通常、コードの可読性をかなり低下させることです。

あなたのコードのように書かれるべき

:離れての欠如から、あなたが生成されたマシンコードが同じになります。1.にこれらの2行をマージすることにより、を獲得していないことを理解することが重要である

shmaddr = shmat(shmid,0,0); 
if(chmaddr == (char*)-1){ 

上記のバージョンのバグ。

関連する問題