2016-11-16 6 views
2

私はPOSIXで共有メモリセグメントを使用しようとしており、特定のアドレスにメモリがあるかどうかを調べるのに多くの問題があります。Cの型キャストを使用して、アドレスへのポインタでメモリのサイズを取得できますか?

私はptrが、いくつかの呼び出しからmmap (....)

に返されたポインタである私は本当にこれがどのように動作するか理解していないfile_size = *(size_t *)ptr

を使用するソリューションを見ました。 *(size_t *)タイプキャスティングは何をしますか?私は(size_t)*varと仮定して、ポインタvarの値をsize_tの型にキャストします。しかし、別のアスタリスクを置くと、これは私にもう一度ポインタを与えるだろうか?

+3

メモリ位置の最初の 'sizeof(size_t)'バイトを読み込みます。誰かがそこにあるメモリブロックのサイズを書いたなら、その場所からそれを読むことができます。 – mch

+0

"&"を使用してポインタを取得します。 "*"はポインタを破棄し、あなたの値を取得します。 –

+0

あなたの応答のために@mchありがとう もし私が*(int *)memを使用した場合、これはその場所の最初のsizeof(int)バイトを読み込みますか? – rafiya

答えて

2

なし与えられたポインタが指す割り当てられたメモリのサイズを決定する一般的な方法があります。またはそれが有効なオブジェクトを指しているかどうかを判断することもできます。同様のものを特定するシステム固有の方法がいくつかありますが、信頼できない可能性があります。また、ポインタが有効なオブジェクトを指し示していると判断することはできません。

あなたはこの情報を慎重に追跡する必要があります。

あなたが記述方法:

file_size = *(size_t *)ptr; 

が動作することができますかのメモリを具体的に割り当てられた領域の先頭にサイズを保存する何かに割り当てられているために起こる - しかし、あなたはすでに知っている場合にのみ、そのptrが有効です。

ptrは、(関数ポインタ以外の)任意の型のポインタである可能性があります。キャスト(size_t *)は、ptrという値をsize_tオブジェクトへのポインタとして扱うことができるように、を変換します(size_tはサイズの表現に使用される符号なし整数型です)。 size_t*値を参照解除演算子*で参照解除すると、size_tオブジェクトの値が得られます。ここで

はこのように働くかもしれない仮想的な配分機能の例です:

void *allocate(size_t size) { 
    void *result = malloc(sizeof (size_t) + size); 
    if (result != NULL) { 
     *(size_t*)result = size; 
    } 
    return result; 
} 

、あなたに現在割り当てられているサイズ与える関数:

size_t curr_size(void *ptr) { 
    return *(size_t*)ptr; 
} 

NOTEこれは、アライメントを無視していることを問題。 size_tがより厳密なアライメントを必要とするものにメモリを割り当てる場合、これは失敗する可能性があります。

関連する問題