0

メモリアドレスが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

6 に答える 6

5

最小で約35バイトですが、mallocの一般的な実装では、サポートする最小割り当てサイズがある程度あるため、実際には、それよりも多くのメモリを使用することが予想されます(ただし、正確にはどれだけ多くのメモリが変化します)。

通常、最小割り当ては16バイトまたは32バイトのようなものになります。この場合、上記で指定したサイズのほとんどは実際には何の違いもありません。最後の5つの割り当てはすべて、最小が発生したものになります。なれ。通常、それより大きいサイズは2の次の累乗にも切り上げられます。

これにより、最初の割り当てに32バイト、他の5つのそれぞれに16または32(つまり、サポートされる最小サイズ)が与えられ、合計で112バイトまたは192バイトになります。

于 2010-10-01T15:28:51.677 に答える
3

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
于 2010-10-01T15:27:10.407 に答える
2

コンピューターに計算させてください:

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);
于 2010-10-01T16:03:55.560 に答える
1

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));
于 2010-10-01T15:28:40.047 に答える
1

たとえば、システムに割り当てられているバイト数を取得します

#define malloc(s) mm(s)

void *mm(size_t s) {
    printf("allocating %d ...\n", (int)s);
    return (malloc)(s);
}

/* your code */

もちろん、サイズを印刷する代わりに合計することもできます。

于 2010-10-01T16:01:20.560 に答える
0

malloc()割り当てスペースは16バイトに切り上げられます(少なくともwin32では)。したがって、最初の割り当てでは32バイトを使用し、ループでは16*5を使用します。

また、malloc(時間とメモリの両方)のオーバーヘッドもあります。これは、メモリ領域の前にmalloc()特別なヘッダーを配置する_CrtMemBlockHeaderためです(そのため、とまったく同じポインタを指定する必要がfree()あり、などの関数を使用できます_msize()

したがって、実際に使用されるメモリ量は32 + 80=112バイトになります。ヘッダーのオーバーヘッドも考慮してください:+ 5 * sizeof(__ CrtMemBlockHeader)

最終的な量は300バイトにもなる可能性があります。これは、予想される35の約8倍です。

于 2010-10-01T19:09:29.523 に答える