2012-02-23 9 views
1

mmapのサイズパラメータを理解するのが苦労しています(申し訳ありませんが、私のCは錆びています)。 (たとえば、別のSOポストから採取)mmapのサイズパラメータを理解する

我々が持っている場合:

typedef struct container { 
    int counter; 
} container; 

container *memory; 
memory = mmap(NULL, 500*sizeof(container), PROT_READ|PROT_WRITE, MAP_SHARED, -1, 0); 

container *entry = (container *) malloc(sizeof(container)); 
entry->counter = 1; 
// Just arbitrarily 
memory[1] = *entry; 

メモリ[1]は単にコンテナへのポインタでなく、したがってはsizeof(容器)ではないのだろうか?あるいは、mmapを使用する方法がありますが、実際にはコンテナーの500エントリしか挿入されないことを保証しますか?または、sizeof(コンテナ)のステップでメモリにアクセスする必要がありますか?

ありがとうございます!

+0

メモリはコンテナへのポインタなので、メモリ[1]はコンテナです。これは*(メモリ+ 1)と同じです。 –

答えて

2

まず、mmapを使用してメモリを取得しているうちに、mmapに固有の質問はありません。あなただけやっていた場合、同じ結論が適用されます:

container *memory = malloc(500*sizeof(container)); 

をどちらの場合も、あなたは長さ500*sizeof(container)バイトのメモリのブロックを持っている、と返されたポインタは配列の最初の要素を指しているとみなすことができます500 container構造体。

+0

しかし、私はmemory [0] = * entryを実行すると、それはエントリへのポインタなので、32ビットのポインタなのでしょうか?エントリをメモリにmemcpyする必要がありますか? – Rio

+0

@Rio:いいえ - 'memory'はポインタですが、' memory [0] 'は' struct'です。 '* entry'と同じです - あなたはここに別の構造体を割り当てています。これは問題ありません。 – caf

+0

そして、ポインタのサイズは実装固有であり、必ずしも32ビットではありません。 –

関連する問題