sai’s diary

プログラミング関連の備忘録とつぶやきを書いています。

malloc_usable_size() - malloc()で確保したサイズを取得したい場合。

当時、何の用途で調べていたか忘れてしまいましたが、 malloc_usable_size()を使用するとmalloc()で確保したアドレスからサイズを取得出来ます。

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

int main( int argc, char **argv ) {
  if ( 2 != argc ) {
    printf("%s size\n",argv[0]);
    return 255;
  }
  size_t req_size = strtol(argv[1],NULL,10);
  char *p = malloc( req_size );
  size_t size = malloc_usable_size ( p );
  printf("req_size=%d,size=%d\n",req_size,size);
  free( p );
  p = NULL;

  return 0;
}

以下は実行結果です。

[user@localhost sample]$ ./a.out 1
req_size=1,size=12
[user@localhost sample]$ ./a.out 12
req_size=12,size=12
[user@localhost sample]$ ./a.out 13
req_size=13,size=20

malloc()に指定したサイズとmalloc_usable_size()の返り値が異なるのは malloc()内部でヒープ領域が一定のサイズに切り上げられて確保されているためだと考えられます。

参考サイト

malloc_usable_size(3) - Linux manual page

malloc(3)のメモリ管理構造 | VA Linux Systems Japan株式会社

環境

CentOS release 6.5 (Final) gcc-4.4.7-4.el6.i686 glib2-2.26.1-3.el6.i686