なし与えられたポインタが指す割り当てられたメモリのサイズを決定する一般的な方法があります。またはそれが有効なオブジェクトを指しているかどうかを判断することもできます。同様のものを特定するシステム固有の方法がいくつかありますが、信頼できない可能性があります。また、ポインタが有効なオブジェクトを指し示していると判断することはできません。
あなたはこの情報を慎重に追跡する必要があります。
あなたが記述方法:
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
がより厳密なアライメントを必要とするものにメモリを割り当てる場合、これは失敗する可能性があります。
メモリ位置の最初の 'sizeof(size_t)'バイトを読み込みます。誰かがそこにあるメモリブロックのサイズを書いたなら、その場所からそれを読むことができます。 – mch
"&"を使用してポインタを取得します。 "*"はポインタを破棄し、あなたの値を取得します。 –
あなたの応答のために@mchありがとう もし私が*(int *)memを使用した場合、これはその場所の最初のsizeof(int)バイトを読み込みますか? – rafiya