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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

4回答

6871閲覧

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

itty

総合スコア7

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2018/03/26 23:52

やりたいこと

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.

該当のソースコード

C

1#include <stdio.h> 2#include <stdlib.h> 3#include <malloc.h> 4 5int main(int argc, char const *argv[]) { 6 int len = 12; 7 int *p = malloc(sizeof(int) * len); 8 int p_size = sizeof(p)/sizeof(int); 9 printf("%d\n",p_size); 10 printf("%d\n",malloc_usable_size(p)); 11 free(p); 12 return 0; 13}

環境

OS X 10.13.2

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

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

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

投稿2018/03/27 00:00

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

itty

2018/03/27 00:07

回答ありがとうございます。 後から取得はできないんですね。 サイズを覚えておく変数を用意する方針で進めてみようと思います。
y_waiwai

2018/03/27 00:10

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

2018/03/27 00:12

なるほど、、 調べていただきありがとうございます。
guest

0

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 00:00

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

itty

2018/03/27 00: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)
Zuishin

2018/03/27 00:06

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

2018/03/27 00:11

配列を宣言する場所と、配列の長さが欲しい場所が離れているため、 関数で取得できると便利だと思い質問させていただきました。 そのようにサイズが計算できるように構造体の内容を変更してみようと思います。
guest

0

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

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

投稿2018/03/27 01:46

gm300

総合スコア580

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

itty

2018/03/27 02:14

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

0

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

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

投稿2018/03/27 01:11

a_saitoh

総合スコア702

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

itty

2018/03/27 02:14

回答ありがとうございます。 そのように実装を変更したところ、 意図したように動いたのでこれでよしとします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問