0

プログラムで適切なサイズのメモリを割り当てる際に問題が発生しています。私は次のことを行います:

void * ptr = sbrk(sizeof(void *)+sizeof(unsigned int));

これを行うと、バイト単位ではなく void* 単位で割り当てているため、ヒープにメモリを追加しすぎていると思います。sizeof ( anything ) が他の単位ではなくバイトを意味するようにするにはどうすればよいですか?

編集:

コンパイラがサイズをバイト単位で取得するように、他の人がものを char としてキャストするのを見てきました。sizeof(unsigned int) が 4 バイトで、使用していた型が void * の場合、コンパイラは 4 バイトではなく void * のサイズの 4 倍でブレークしますか?

4

2 に答える 2

0

カーネルは、プロセス メモリをページ単位で管理します。これは、プロセスのアドレス空間が整数ページ分だけ拡大 (または縮小) しなければならないことを意味します。
したがってsbrk、バイト数を取得しても、プロセスに少なくとも 1 ページが追加されます。

于 2012-02-13T21:26:49.923 に答える
0

の引数としてバイト数を渡しますsbrk

Linux では、 のプロトタイプsbrkは次のとおりです。

void *sbrk(intptr_t increment);

http://www.kernel.org/doc/man-pages/online/pages/man2/brk.2.html

sbrk() は、プログラムのデータ空間をインクリメント バイトだけインクリメントします。

mallocしかし、コメントの一部の人々が追加したように、メモリを動的に割り当てたい場合は、関数ではなく関数を探していsbrkます。brksbrkは、通常、mallocユーザー関数の実装のために内部で使用されるシステム コールです。

于 2012-02-13T21:16:05.307 に答える