2017-06-05 15 views
0

私はプログラムを書いていて、私が署名のないint型とunsigned int型のマッピングの長さとして格納しているメモリ位置を取得しました。munmap警告メッセージの解決

私の次のアプローチは、警告を生成します。

warning: passing argument 1 of ‘munmap’ makes pointer from integer without a cast [enabled by default] 

/usr/include/i386-linux-gnu/sys/mman.h:77:12: note: expected ‘void *’ but argument is of type ‘unsigned int’ 

、ここでは、私に警告を引き起こしている:

//startAddr and addrRange are stored as an unsigned int, 
void unmap(mapping_t *maps, const int *curSize){ 
    int i = 0; 
    for (; i < *curSize; i++){ 
    munmap(maps[i].startAddr, maps[i].addrRange); 
    } 
} 

私はと、munmapを打ったときに私のプログラムにもクラッシュし、私はそれをしなければならないと仮定しています何らかの方法で警告を処理する

struct mapping_tが要求通りに定義されている:

typedef struct mapping{ 
    unsigned int startAddr; 
    unsigned int endAddr; 
    unsigned int addrRange; 
} mapping_t; 
+1

'mapping_t'の定義を投稿してください。そして、あなたは本当にあなたが 'unsigned int'にポインタ値を詰め込んでいないことを願っています。 –

+0

私は 'void *'型に変更すると、コンパイラは彼が – pm100

答えて

2

ポインタには符号なし整数を使用できません。 void *を使用してください。

typedef struct mapping{ 
     void * startAddr; 
     void * endAddr; 
     unsigned int addrRange; 
    } 
mapping_t; 
3

は、私はプログラムを書いていると私はそれをしないでくださいunsigned int型

として格納されているそのメモリ位置を頂いております。 void *,char *、またはさらに[u]intptr_tを使用してください。ポインタをunsigned intに埋め込まないでください。それは間違いです。ポインタはintの値ではなく、intで正しく表現されない可能性があります。そのため、警告が表示されます。ポインタはC標準のintに変換することができます。実際のエラーではなく警告を表示する理由ですが、ポインタ値に変換しても同じアドレスになるという保証はありません。

の長さは、符号なしのintとしてです。これをマップ解除します。

これも行わないでください。 size_tを使用します。

typedef struct mapping{ 
    void *startAddr; 
    size_t addrRange; 
} mapping_t; 

あなたは開始アドレスとサイズを持っているとして、あなたはendAddrは必要ありません。終了アドレスが必要な場合は、startAddrchar *に変換して終了アドレスを計算する必要があります。

+0

だと確信していると思いますが、 'unsigned int'を' startAddr'に読み込む方法は? 'sscanf(行、"%x-%x%s "、(unsigned int *)マップ[* curSize] .startAddr、...)'のように私の価値観をどのように読み替えていたのですか?私の試みで今すぐクラッシュするプログラム –

+0

"' startAddr'( 'scanf')で' unsigned int'を読むと、いくつかのレベルでデザインエラーになります。最も重要なのは、プロセスAのマッピングのアドレスは、プロセスBが考えるものではなく、 'mmap'がAを処理するために返すアドレスです。第二に、共有メモリを気にするほどパフォーマンスが重要なコードの場合は、IPCメッセージのバイナリシリアル化を使う価値があります。そして最後に[何にも 'scanf'を使用しないでください(https://stackoverflow.com/questions/15664664/scanf-regex-c/15664816#15664816)。 – zwol