メモリアドレスが4バイトを占め、charが1バイトを占めると仮定します。
char** t;
t = malloc(5 * sizeof(char*));
int i;
for (i = 0; i < 5; i++)
t[i] = malloc(sizeof(char) * (i+1));
メモリアドレスが4バイトを占め、charが1バイトを占めると仮定します。
char** t;
t = malloc(5 * sizeof(char*));
int i;
for (i = 0; i < 5; i++)
t[i] = malloc(sizeof(char) * (i+1));
最小で約35バイトですが、mallocの一般的な実装では、サポートする最小割り当てサイズがある程度あるため、実際には、それよりも多くのメモリを使用することが予想されます(ただし、正確にはどれだけ多くのメモリが変化します)。
通常、最小割り当ては16バイトまたは32バイトのようなものになります。この場合、上記で指定したサイズのほとんどは実際には何の違いもありません。最後の5つの割り当てはすべて、最小が発生したものになります。なれ。通常、それより大きいサイズは2の次の累乗にも切り上げられます。
これにより、最初の割り当てに32バイト、他の5つのそれぞれに16または32(つまり、サポートされる最小サイズ)が与えられ、合計で112バイトまたは192バイトになります。
35バイト(分割については以下を参照)
char** t;
t = malloc(5 * sizeof(char*)); // 5 * 4 = 20 bytes
int i;
for (i = 0; i < 5; i++)
t[i] = malloc(sizeof(char) * (i+1)); //1 + 2 + 3 + 4 + 5 = 15 bytes
コンピューターに計算させてください:
char** t;
t = (char**) malloc(5 * sizeof(char*));
int i;
for (i = 0; i < 5; i++)
t[i] = (char*) malloc(sizeof(char) * (i+1));
unsigned int sz = 5 * sizeof(char*);
for (i = 0; i < 5; i++)
sz += sizeof(char) * (i+1);
printf("%d\n", sz);
32ビットマシンでは35。
そのための20
t = malloc(5 * sizeof(char*));
そのための15:5 + 4 + 3 + 2 + 1
int i;
for (i = 0; i < 5; i++)
t[i] = malloc(sizeof(char) * (i+1));
たとえば、システムに割り当てられているバイト数を取得します
#define malloc(s) mm(s)
void *mm(size_t s) {
printf("allocating %d ...\n", (int)s);
return (malloc)(s);
}
/* your code */
もちろん、サイズを印刷する代わりに合計することもできます。
malloc()
割り当てスペースは16バイトに切り上げられます(少なくともwin32では)。したがって、最初の割り当てでは32バイトを使用し、ループでは16*5を使用します。
また、malloc(時間とメモリの両方)のオーバーヘッドもあります。これは、メモリ領域の前にmalloc()
特別なヘッダーを配置する_CrtMemBlockHeader
ためです(そのため、とまったく同じポインタを指定する必要がfree()
あり、などの関数を使用できます_msize()
。
したがって、実際に使用されるメモリ量は32 + 80=112バイトになります。ヘッダーのオーバーヘッドも考慮してください:+ 5 * sizeof(__ CrtMemBlockHeader)
最終的な量は300バイトにもなる可能性があります。これは、予想される35の約8倍です。