C言語関係掲示板

過去ログ

No.1245 malloc のサイズ

[戻る] [ホームページ]
No.2485

メモリの動的確保について
投稿者---amethyst(2004/08/17 19:24:33)


猿から始めるC言語というウェブページを見ていたら、次のような一文がありました。

「malloc の引数はバイト数で渡すので、double 型の配列なら 実際の添字数の sizeof(double) 倍 (おそらく8倍) にして渡しています。」

これはどういう意味でしょうか。実際の添字数の sizeof(double) 倍というところが特に意味が理解できないので教えてください。


No.2486

Re:メモリの動的確保について
投稿者---円零(2004/08/17 19:57:05)


>猿から始めるC言語というウェブページを見ていたら、次のような一文がありました。
>
>「malloc の引数はバイト数で渡すので、double 型の配列なら 実際の添字数の sizeof(double) 倍 (おそらく8倍) にして渡しています。」
>
>これはどういう意味でしょうか。実際の添字数の sizeof(double) 倍というところが特に意味が理解できないので教えてください。

http://www.gulf.or.jp/~damayan/saru/pointer2.html
これですか。

これは例えば、double型が一つにつき8バイトを使用する処理系の場合、
double型を10個格納できるメモリブロックを確保したかったら80バイト確保しなくてはいけません、
という意味です。


No.2488

Re:メモリの動的確保について
投稿者---Sciggepy(2004/08/17 20:04:00)


double型の変数は、sizeof(double)バイト(大抵8バイト)の記憶域を使用します。内容については、ここのホームページから探してください。

すなわち、mallocで領域を動的確保する際も、double型の変数1個につき、sizeof(double)バイト確保する必要があります。
動的確保を使うのは、大抵、配列を割り当てる場合ですが、上によれば、double型のn個の要素からなる配列の領域を割り当てるには、

p=(double *)malloc(n*sizeof(double));

のようにしなければなりません。
callocを使えば、次のようにも書けます。

p=(double *)calloc(n,sizeof(double));

この場合、割り当てたメモリ領域がすべて0で初期化されるので、mallocよりも便利なことがあります。



No.2496

Re:メモリの動的確保について
投稿者---RiSK(2004/08/17 23:32:41)


ちょっとツッコミ

>p=(double *)calloc(n,sizeof(double));
>
>この場合、割り当てたメモリ領域がすべて0で初期化されるので、mallocよりも便利なことがあります。

double 型の場合は便利ではない気がします。
C FAQ 7.31


No.2499

Re:メモリの動的確保について
投稿者---Sciggepy(2004/08/18 12:32:06)


>ちょっとツッコミ返し(笑)

>>この場合、割り当てたメモリ領域がすべて0で初期化されるので、mallocよりも便利なことがあります
可能性を示しただけです。本当に便利かどうかは、個々のプログラムに依存します。



No.2503

Re:メモリの動的確保について
投稿者---円零(2004/08/19 18:49:15)


>>ちょっとツッコミ返し(笑)
>
>>>この場合、割り当てたメモリ領域がすべて0で初期化されるので、mallocよりも便利なことがあります
>可能性を示しただけです。本当に便利かどうかは、個々のプログラムに依存します。

double型を全ビットゼロで埋めて便利な場合って、例えばどんなケースですか?



No.2505

Re:メモリの動的確保について
投稿者---円零(2004/08/19 19:05:21)


>double型を全ビットゼロで埋めて便利な場合って、例えばどんなケースですか?

削除パスワード入れてないので削除できませんが取り消します。
環境依存だとしても、便利な場合がないというわけではないですね。




No.2506

Re:メモリの動的確保について
投稿者---Sciggepy(2004/08/19 20:17:43)


>double型を全ビットゼロで埋めて便利な場合って、例えばどんなケースですか?

少し説明不足でしたか?double型に限定したつもりは全くないのですが...
構造体の領域を確保する際に、初期化されていたほうが便利なことがある、と言っておきましょう。
といっても、memsetを書く手間が省けるというだけのことですが。
私が現在作っているプログラムの中でも

pei=(EDITINFO *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,sizeof(EDITINFO));
pei->lpStream=(LPTSTR)HeapAlloc(pei->hHeap,HEAP_ZERO_MEMORY,CCE_STREAMBUF);

のように、メモリ領域を0で初期化している部分があります。



No.2507

Re:メモリの動的確保について
投稿者---円零(2004/08/20 09:27:35)


>少し説明不足でしたか?double型に限定したつもりは全くないのですが...

了解しました。でも、
↓のように書けば、double型に限定した話に見えても不思議はないと思いますが。

>p=(double *)calloc(n,sizeof(double));
>
>この場合、割り当てたメモリ領域がすべて0で初期化されるので、mallocよりも便利なことがあります。



No.2512

Re:メモリの動的確保について
投稿者---Sciggepy(2004/08/20 15:51:41)


>↓のように書けば、double型に限定した話に見えても不思議はないと思いますが。
>
>>p=(double *)calloc(n,sizeof(double));
>>
>>この場合、割り当てたメモリ領域がすべて0で初期化されるので、mallocよりも便利なことがあります。
確かにそう取られる可能性は充分ですねヮ
「この場合」ではなく、「callocを使ってメモリを確保した場合」と書くべきでした。



No.2509

Re:メモリの動的確保について
投稿者---YuO(2004/08/20 13:40:20)


>構造体の領域を確保する際に、初期化されていたほうが便利なことがある、と言っておきましょう。

構造体が初期化されていると便利だというのは同意しますが,

>といっても、memsetを書く手間が省けるというだけのことですが。

構造体の初期化とは各メンバの値を0だの0.0だのNULLだのにすることとは異なります。
無効な値を持っていれば,それは初期化された構造体ではありません。


callocは単にメモリ領域に0を埋め込んでくれるだけで,初期化してくれるのではないですよ。



No.2511

Re:メモリの動的確保について
投稿者---Ban(2004/08/20 13:57:54)


>callocは単にメモリ領域に0を埋め込んでくれるだけで,初期化してくれるのではないですよ。

「個々のプログラムに依存します」とかかれてますから、
「メモリ領域が 0 で埋まっている事が初期化だと定義している」
場合を想定しているでしょうし、そうでなければ calloc に
そういった恩恵がないというだけでしょう。

# 現実的には memset で 0 埋めするものは多いと思いますが。




No.2516

Re:メモリの動的確保について
投稿者---YuO(2004/08/21 00:36:36)


>「個々のプログラムに依存します」とかかれてますから、

それは,「mallocよりもcallocの方が便利である」か否かを言っているのであって,
「メモリ領域を0で埋めることが初期化であるかどうかが個々のプログラムに依存している」
と発言者は言っていないのではないでしょうか。


>「メモリ領域が 0 で埋まっている事が初期化だと定義している」

本来の定義から外れるのですから,そのように使うのであれば断って使った方がよいでしょう。


No.2513

Re:メモリの動的確保について
投稿者---Sciggepy(2004/08/20 16:17:46)


>callocは単にメモリ領域に0を埋め込んでくれるだけで,初期化してくれるのではないですよ。

初期化をどう定義するかは、最終的にはプログラム依存ですが、「記憶域の初期化」に関しては、「記憶域を既知のビット列で埋める」という意味でよく使われています。
MSDNライブラリでも、「0で初期化」や"initialize to 0"という表現を見かけます。



No.2517

Re:メモリの動的確保について
投稿者---YuO(2004/08/21 00:36:41)


>初期化をどう定義するかは、最終的にはプログラム依存ですが、

Cにおいて初期化とは,
「初期化子を利用してオブジェクトに初期値を与えること」
以外の定義は存在しないはずですが。
もちろん,「私はこういう定義を勝手にしている」という定義は存在するでしょうが。


>「記憶域の初期化」に関しては、「記憶域を既知のビット列で埋める」という意味でよく使われています。>MSDNライブラリでも、「0で初期化」や"initialize to 0"という表現を見かけます。

記憶域の初期化という意味では0で初期化はあり得るでしょう。
しかし,それはオブジェクトを初期化しているのではないです。
Cにおいて,割付け記憶域期間を持つオブジェクトを初期化する術はありません。
#C++であればコンストラクタを利用して初期化可能。



No.2518

Re:メモリの動的確保について
投稿者---Sciggepy(2004/08/21 12:15:19)


>Cにおいて初期化とは,
>「初期化子を利用してオブジェクトに初期値を与えること」
>以外の定義は存在しないはずですが。
Cの規格に関してはあまり知らないので、「こういう定義があったのか」という感想です。
初期化子とは、

int d=5;

で使われている=のことでしょうか?(他にそのようなものがなさそうなので。)

>もちろん,「私はこういう定義を勝手にしている」という定義は存在するでしょうが。
勝手に定義していました。付け足しで書いた部分なので、そこまで気を使ってはいませんでした。

>>「記憶域の初期化」に関しては、「記憶域を既知のビット列で埋める」という意味でよく使われています。>MSDNライブラリでも、「0で初期化」や"initialize to 0"という表現を見かけます。
>
>記憶域の初期化という意味では0で初期化はあり得るでしょう。
そのつもりで使っていました。抽象度の高い言葉を使うときに注意が必要なのは十分承知していますが、言葉が足りていなかったと思います。

#公式に定義されている言葉の使い方を誤るのは宜しくないですね。
#しかし、言葉(記号というべきか)の意味が最終的に個人(というより受け取り側)に依存することは、どうしても避けられない...



No.2508

Re:メモリの動的確保について
投稿者---チェリーC(2004/08/20 11:16:16)


すみません横から質問なのですが、
なぜdoubleだと便利じゃない可能性があるのでしょうか・・?


No.2510

Re:メモリの動的確保について
投稿者---あかま(2004/08/20 13:54:59)


>すみません横から質問なのですが、
>なぜdoubleだと便利じゃない可能性があるのでしょうか・・?
浮動小数点の型では全てのビットを0にセットしても、値が0.0になるとは限らないからです。
この辺は処理系依存になります。
最近の処理系では大抵0.0になるとは聞きますが。



No.2492

Re:メモリの動的確保について
投稿者---Yuki(2004/08/17 21:25:37)


>猿から始めるC言語というウェブページを見ていたら、次のような一文がありました。
>
>「malloc の引数はバイト数で渡すので、double 型の配列なら 実際の添字数の sizeof(double) 倍 (おそらく8倍) にして渡しています。」
>
>これはどういう意味でしょうか。実際の添字数の sizeof(double) 倍というところが特に意味が理解できないので教えてください。

単純にdouble変数の配列を10個用意してくださいといったときは
double hoge1[10];
となりますよね。

これと同じサイズを動的に確保してくださいといったときは
double *hoge2;
hoge2 = (double *)malloc( sizeof( double ) * 10 );
となります。
malloc関数の引数には確保する領域のサイズをバイト単位で指定しないと
いけないので、sizeof演算子で取得したdouble型のサイズ*確保したい要素数となります。


ためしに
printf( "double型のサイズ   :%d", sizeof( double ));
printf( "hoge1のサイズ    :%d", sizeof( hoge1 ));
printf( "hoge2を確保するサイズ:%d", sizeof( double ) * 10 );
を出力してみるとわかりやすいかもしれません。

※注意:hoge2に対してsizeof演算子を使用するとdouble *型のサイズを取得することになります。


No.2502

Re:メモリの動的確保について
投稿者---amethyst(2004/08/19 16:37:34)


みなさま、ありがとうございます。頼もしい限りでございます。