2016-05-15 9 views
0

shm_openのおかげで作成され、void ** tableを含む構造体を含む共有メモリゾーンのテーブルにアクセスしようとしています。 さまざまなmallocのおかげでそれを初期化しました しかし、私はそれにアクセスしようとすると、私はセグメンテーション違反を取得します。 私はそれがmemcpy命令のためだと推測していますが、私はなぜそれがわかりません。誰かが私を助けることができますか?shm_memory + mmap + table + struct

バグのある部分があります。

if(channel->index > 0){ 
    if(DEBUG){ 
     printf("channel_recv : channel->index > 0 (%d) \n",channel->index); 
    } 
    if(memcpy(data,channel->tampon[0],channel->eltsize)==NULL){ 
     return -1; 
    } 
    printf("apres memcpy \n"); 
    defile(channel); 
    return 1; 
} 

初期化があります。

channel = (struct channel *)malloc(sizeof(struct channel)); 
channel->tampon = malloc(size * sizeof(void *)); 
for(i = 0 ; i < size;i++){ 
    channel->tampon[i] = malloc(eltsize * sizeof(void)); 
} 

「汚す」機能は左にそれにすべての要素を移動します。

+0

とあなたは 'channel-> eltsize'をどこかで非ゼロ値に設定しますか? – wildplasser

+0

はいchannel-> eltsizeとchannel-> sizeが指定されていて、0または負でないかどうかをテストします。実際には、バグがmemcpy、特にチャネル - タンポンに関係する部分は、セグメンテーションフォールト – kevin556

+0

このコードは、iffyのように見えます...チャネル構造体の定義など、より多くのコンテキストを含めることができます。あなたはsizeof(void)でどのくらいのメモリを割り当てようとしていますか? – kcraigie

答えて

1

あなたの初期化

channel->tampon[i] = malloc(eltsize * sizeof(void)); 

間違っています。

ISO/IEC 9899:201X

voidタイプは、値の空のセットを含みます。完了できない不完全な オブジェクトタイプです。

...

sizeofオペレータは、そのような タイプの括弧名に、 関数型または不完全型を持つ式に適用されるものではない...