2017-05-03 6 views
0

2次元配列にデータを格納するプログラムを作成したいとします。この2D配列は共有メモリに作成する必要があります。共有メモリに2D配列を作成する

#include <stdio.h> 
#include <sys/types.h> 
#include <sys/ipc.h> 
#include <sys/shm.h> 



key_t key; 
int shmBuf1id; 
int *buf1Ptr; 

main(int argc, int *argv[]) 
{ 
    createBuf1(); 

} 

createBuf1() 
{ 
    key = ftok(".",'b'); 
    shmBuf1id = shmget(key,sizeof(int[9][9]),IPC_CREAT|0666); 

    if(shmBuf1id == -1) 
    { 
    perror("shmget"); 
    exit(1); 
    } 

    else 
    { 
    printf("Creating new Sahred memory sement\n"); 
    buf1Ptr[3] = shmat(shmBuf1id,0,0); 
    if(buf1Ptr == -1) 
    { 
     perror("shmat"); 
     exit(1); 
    } 


    } 

} 

しかし、私はこのプログラムを実行すると、セグメンテーションフォルト(コアダンプ)エラーが発生します。共有メモリに2D配列を正しく作成しましたか?

+0

あなたは 'buf1Ptr [3]'に割り当てられる前に 'buf1Ptr'を初期化したことはありません。 – Barmar

+0

2次元配列は存在せず、1次元配列(1D配列)もありません。これはidenomaticな方法です。 'int *'は 'int'へのポインタです。 – Olaf

答えて

1

まず、int *buf1Ptrはintへのポインタです。あなたのケースでは、整数の2次元配列へのポインタをしたい、ようにあなたはそれを宣言する必要があります

buf1Ptr = shmat(shmBuf1id,0,0); 

今あなたがアクセスすることができます。そして、あなたは、ポインタ自体を初期化する必要が

int (*buf1Ptr)[9]; 

あなたの配列はbuf1Ptr(すなわちbuf1Ptr[0][0] = 1)です。

#include <stdlib.h> 
#include <stdio.h> 
#include <sys/ipc.h> 
#include <sys/shm.h> 

key_t key; 
int shmBuf1id; 
int (*buf1Ptr)[9]; 

void 
createBuf1() 
{ 
    key = ftok(".",'b'); 
    shmBuf1id = shmget(key,sizeof(int[9][9]),IPC_CREAT|0666); 

    if(shmBuf1id == -1) 
    { 
    perror("shmget"); 
    exit(1); 
    } 
    else 
    { 
    printf("Creating new Sahred memory sement\n"); 
    buf1Ptr = shmat(shmBuf1id,0,0); 
    if(buf1Ptr == (void*) -1) 
    { 
     perror("shmat"); 
     exit(1); 
    } 
    } 
} 

int 
main(int argc, int *argv[]) 
{ 
    createBuf1(); 
    return 0; 
} 
+0

2d配列を初期化するためになぜint(* buf1Ptr)[9]を使用したのですか教えてください。 int(* buf1Ptr)[9] [9]ではありませんか? (それは2dなので) –

+0

これは、(* buf1Ptr)[0] [0]ではなく、buf1Ptr [0] [0]のようなコードを使ってセルにアクセスすることを可能にします。これは、配列とポインタがCで多かれ少なかれ同じものなので、ポインタ自体が最初の次元であるために機能します。 – fernan

-1

あなたはメモリを割り当てるのを忘れ:

#include <stdio.h> 
#include <sys/types.h> 
#include <sys/ipc.h> 
#include <sys/shm.h> 



key_t key; 
int shmBuf1id; 
int *buf1Ptr; 

int main(int argc, char *argv[]) 
{ 
    createBuf1(); 

} 

createBuf1() 
{ 
    key = ftok(".",'b'); 
    shmBuf1id = shmget(key,sizeof(int[9][9]),IPC_CREAT|0666); 

    if(shmBuf1id == -1) 
    { 
    perror("shmget"); 
    exit(1); 
    } 

    else 
    { 
    printf("Creating new Sahred memory sement\n"); 
    int buf1Ptr[4]; 
    buf1Ptr[3] = shmat(shmBuf1id,0,0); 
    if(buf1Ptr == -1) 
    { 
     perror("shmat"); 
     exit(1); 
    } 


    } 

} 
+0

それ以上説明できますか?なぜあなたはint buf1Ptr [2]を使いましたか? –

+0

間違いだったので、私は[4] を使ってみたかったのですが、buf1Ptr [4]はメモリの4番目の位置を使いたかったので使用しました。だから、それ以上の4つの位置を持つ配列にする必要があります –

関連する問題