質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.37%

mallocで確保した領域のサイズを得たい

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 12K+

score 7

 やりたいこと

C言語で
int*型を用いてintの配列をつくり、
その配列の長さを取得したいです。

mallocで確保した領域の長さが分かれば良いのですが、
malloc_usable_sizeという関数が動きません。

malloc_usable_sizeの動かし方、
もしくは同等の結果を得る別の方法があれば教えていただきたいです。

 試したこと

ソースコード(下に添付)8行目のように、sizeofで計算しようとすると、
sizeof(p)がint*のサイズを返してしまうため、lenにかかわらず8を返してしまいます。
また、mallocで確保した領域のサイズを返す、malloc_usable_sizeという関数があるようですが、malloc.hのincludeでエラーが出ます。

 発生している問題・エラーメッセージ

以下エラーメッセージです。

pointer.c:3:10: fatal error: 'malloc.h' file not found
#include <malloc.h>
         ^~~~~~~~~~
1 error generated.

 該当のソースコード

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

int main(int argc, char const *argv[]) {
  int len = 12;
  int *p = malloc(sizeof(int) * len);
  int p_size = sizeof(p)/sizeof(int);
  printf("%d\n",p_size);
  printf("%d\n",malloc_usable_size(p));
  free(p);
  return 0;
}

 環境

OS X 10.13.2

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+2

malloc 関数はstdlib.h をインクルードしてください。

malloc関数で確保したエリアのサイズは、後付けでは取得できません。
なので、この関数実行時のサイズを覚えておく必要がありますねー

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/27 09:07

    回答ありがとうございます。

    後から取得はできないんですね。

    サイズを覚えておく変数を用意する方針で進めてみようと思います。

    キャンセル

  • 2018/03/27 09:10

    malloc_usable_size関数は、ぐぐってみるとLinuxの関数のようですね。
    他の環境では使用できませんねー

    キャンセル

  • 2018/03/27 09:12

    なるほど、、

    調べていただきありがとうございます。

    キャンセル

+2

malloc.h on OS X

malloc.hが見つからない旨のエラーが出た。フォーラムを巡ってみたところ, (少なくともLeopardでは)malloc.hは /usr/include/直下ではなく, /usr/include/malloc/malloc.h というパスのため,

#include <malloc.h>

#include <malloc/malloc.h>
に変えてコンパイルし直したら通った。

で, 今この記事を書くためにちょっと調べたら, Apple Developer Connectionによると, malloc.hについては

Not supported, use stdlib.h
ということが簡単に見つかった。なーんだ。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/27 09:04

    回答ありがとうございいます。

    #include <malloc.h>

    #include <malloc/malloc.h>
    に変えたところ、includeはできるようになりましたが、
    malloc/malloc.h内でmalloc_usable_sizeが定義されていないとエラーが出てしまいました。

    pointer.c:10:17: warning: implicit declaration of function 'malloc_usable_size'
    is invalid in C99 [-Wimplicit-function-declaration]
    printf("%d\n",malloc_usable_size(p));
    ^
    1 warning generated.
    Undefined symbols for architecture x86_64:
    "_malloc_usable_size", referenced from:
    _main in pointer-c7b7c9.o
    ld: symbol(s) not found for architecture x86_64
    clang: error: linker command failed with exit code 1 (use -v to see invocation)

    キャンセル

  • 2018/03/27 09:06

    引用したようにサポートされてないので定義されていなくても仕方ありません。
    sizeof(int) * len ではいけないのですか?

    キャンセル

  • 2018/03/27 09:11

    配列を宣言する場所と、配列の長さが欲しい場所が離れているため、
    関数で取得できると便利だと思い質問させていただきました。

    そのようにサイズが計算できるように構造体の内容を変更してみようと思います。

    キャンセル

+1

malloc_usable_sizeはマニュアルに「GNU拡張である」と明記されてますので、POSIXでは規定されてない、GLIBCでの追加機能ですね。linuxでは使えますが、OS Xにはない、ということでしょう。

mallocしたときに指定したサイズをちゃんと保管しておいて使うしかないですね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/27 11:14

    回答ありがとうございます。

    そのように実装を変更したところ、
    意図したように動いたのでこれでよしとします。

    キャンセル

+1

mallocで確保された領域の大きさを知りたいのは、
a. 確保できたか確認したいから。
b. 残りどれだけ確保できるか知りたいから
c. その他の興味
じゃないかと思います。多くの場合、どれだけ取れたかを知るのは意味がありません。その方法はあきらめましょう。

a. の場合は、mallocの返値を信用しましょう。NULLなら失敗。それ以外なら確保成功。
b. の場合は、malloc前の残り-mallocで確保した量 != 残りの量です。
残りの量の決める要因は沢山あるので、引き算では計算できません。一番簡単な部分では、mallocが確保する領域の全てがユーザが使えるわけではなく、ユーザが使える領域の前後にmallocが使う管理用の領域があります。確保する領域の大きさによって管理の方法を変えるのが一般的でその方法によって管理領域のサイズは異なります。数バイトであれば、たとえば4Kbyteの領域を16byteずつ区切って渡してくれます。管理用に256エントリの配列を持っていて使った部分に印をつけます。
c. の場合。ソースコードを読みましょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/27 11:14

    詳しい回答ありがとうございます。
    mallocの仕様について、勉強になりました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る