75

Cで動的に割り当てられたメモリのサイズを調べる方法はありますか?

たとえば、

char* p = malloc (100);

に関連付けられているメモリのサイズを調べる方法はありpますか?

4

15 に答える 15

64

この情報を見つけるための標準的な方法はありません。ただし、一部の実装でmsizeは、これを行うような関数が提供されます。例えば:

ただし、mallocは要求された最小サイズを割り当てるため、実装のmsizeバリアントが実際にオブジェクトのサイズまたはヒープに実際に割り当てられたメモリを返すかどうかを確認する必要があることに注意してください。

于 2009-08-15T11:37:04.630 に答える
55

comp.lang.c FAQリスト・質問7.27-

Q.では、mallocパッケージにクエリを実行して、割り当てられたブロックの大きさを確認できますか?

A.残念ながら、標準的な方法や移植可能な方法はありません。(一部のコンパイラは非標準の拡張機能を提供します。)知る必要がある場合は、自分で追跡する必要があります。(質問7.28も参照してください。)

于 2009-08-15T11:37:56.717 に答える
10

いいえ、C ランタイム ライブラリはそのような機能を提供していません。

一部のライブラリは、この情報を取得できるプラットフォームまたはコンパイラ固有の関数を提供する場合がありますが、通常、この情報を追跡する方法は別の整数変数にあります。

于 2009-08-15T11:25:52.093 に答える
10

サイズとアドレスを格納するためのタグ付きポインターを作成するために私が見た最良の方法は次のとおりです。すべてのポインター関数は引き続き期待どおりに機能します。

盗まれた場所: https://stackoverflow.com/a/35326444/638848

また、malloc のラッパーを実装して、malloc が返すポインタの前にタグ (割り当てられたサイズやその他のメタ情報など) を自由に追加することもできます。実際、これは、C++ コンパイラがオブジェクトに仮想クラスへの参照をタグ付けする方法です。以下に実際の例を示します。

#include <stdlib.h>
#include <stdio.h>

void * my_malloc(size_t s) 
{
  size_t * ret = malloc(sizeof(size_t) + s);
  *ret = s;
  return &ret[1];
}

void my_free(void * ptr) 
{
  free( (size_t*)ptr - 1);
}

size_t allocated_size(void * ptr) 
{
  return ((size_t*)ptr)[-1];
}

int main(int argc, const char ** argv) {
  int * array = my_malloc(sizeof(int) * 3);
  printf("%u\n", allocated_size(array));
  my_free(array);
  return 0;
}

サイズとポインタを持つ構造体に対するこのメソッドの利点

 struct pointer
 {
   size_t size;
   void *p;
 };

malloc と free 呼び出しを置き換えるだけでよいということです。他のすべてのポインター操作は、リファクタリングを必要としません。

于 2016-04-20T05:02:12.297 に答える
2

これは実装に依存すると思います。
ヘッダー データ構造を取得した場合は、それをポインターにキャストしてサイズを取得できます。

于 2009-08-15T11:25:54.683 に答える
1

mallocを使用する場合、サイズを取得できません。

一方、Windowsヒープ関数のようにOS APIを使用してメモリを動的に割り当てる場合は、それを行うことができます。

于 2009-08-15T11:36:53.600 に答える
0

このコードは、おそらくほとんどの Windows インストールで機能します。

template <class T>
int get_allocated_bytes(T* ptr)
{
 return *((int*)ptr-4);
}

template <class T>
int get_allocated_elements(T* ptr)
{
 return get_allocated_bytes(ptr)/sizeof(T);
}
于 2010-10-31T14:50:12.453 に答える
-1

これはうまくいくかもしれません.コードを少し更新してください:

void* inc = (void*) (++p)
size=p-inc;

しかし、これは結果として 1 にpなりchar*ます。その場合int*、結果は 4 になります。

割り当ての合計を調べる方法はありません。

于 2011-07-29T08:02:18.947 に答える