スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
malloc or calloc
さて、メモリを動的に確保できるか 確保できないかが C言語の1つの山じゃないかと思います。。。 とかく、探索系のアルゴリズムに良く出てくるのなんの・・・

今回 ハッシュ(チェイン法)を書いてみたくなり 試してみることにした。

メモリを動的に割り与えるのに C言語では
malloc と calloc があった。 違いはなにか?自分なりの考察

見た目の問題:
malloc は引数が1つであるが、
calloc は引数が2つ。

malloc(sizeof(int)) calloc(size , sizeof(int))

要は callocの方は引数が2つなので 上の例だと
(intの大きさ)*size 確保してくれる。

でもこれは malloc(size*sizeof(int)) と書き換え可能。

ややこしいが sizeは具体的に10とかの数字で、
sizeof( ) は演算子であることに注意!

演算子なのに( )が付くのはPerlやPHPと同じ配慮だと思っておこう・・・ 
実は PerlやPHPでもどうして演算子に( ) が付くのが許されてるのか理解してないが・・・ 関数みたいにどうしても見えるから??

たぶん、クリティカルな違いは
callocで割り当てられたブロックが全て0で初期化されてることではなかろうか・・・

周りでは mallocの方が有名なので(使われてるので)mallocをとうめん使っていこうかな・・・ 

参考資料:
http://www9.plala.or.jp/sgwr-t/lib/malloc.html
http://www9.plala.or.jp/sgwr-t/lib/calloc.html

http://homepage2.nifty.com/tenk/cgokai/sizeof.htm

http://www.bohyoh.com/CandCPP/FAQ/FAQ00096.html
スポンサーサイト
りょこ
私もCの時はmalloc派です。
深い意味はないですが(´・ω・`)
配列は結構動的に確保しているのですが普通に配列を宣言した場合との実行時間に差が出るのか気になるこの頃です。
余裕がないので調べず放置orz
2006/12/11 (月) 10:35:25|URL |#-
K. I.
forとwhileは互いに書き換え可能ですが,どのように使い分けますか?それがヒントになると思います。

それからcallocをmallocで書き換える場合は,本文でも触れているようにメモリをビット0で埋める必要があります。なのでcalloc呼び出し1行は
malloc()
memset()
の2行に書き換えます。構造体をmallocする場合なんかもよく直後にmemset()するよね。

演算子と関数に関してはトラバの方がいいかな。
2006/12/11 (月) 20:01:59|URL |#xOQH1zso
アベント
なんとなく
mallocだと初期化されない分速いかな、位に思ってます。
領域確保の直後に明示的に値を入れる時とかは特に。
ちなみにJavaだとcalloc風の“領域確保後にデフォルト値(0とかfalse)で初期化”って動作ですよ。
2006/12/11 (月) 20:51:34|URL |#CfFZ5oX2
K. I.
記事を書こうとして止まった。

実は PerlやPHPでもどうして演算子に( ) が付くのが許されてるのか理解してないが・・・ 関数みたいにどうしても見えるから??

ってどういう意味ですか?
2006/12/11 (月) 22:35:58|URL |#xOQH1zso
ビンゴ中西
>りょこさん
おお。malloc使ってるのかすごいな。
意識して 動的に確保したの今回初めてだよ・・・俺・・・ mallocの使い方調べまくってたときに 実行時間あたりの話が ちらっと目に付いたが・・・ あんまり確信もてんなぁ どれがいいんだろうねぇ。。

>アベントさん
うーむ。やっぱり 感覚で使い分けてる感じですねぇ。 Javaというのはnewのことですか?(てか これしか知らない・・・(汗)

>K.I.くん
あれかな whileは繰り返し回数が わからないときにつかって forは ちゃんと繰り返し回数がわかっているときに 使うから、、 そんな感じで 動的に割り当てるサイズが わからないときはcallocで、mallocは サイズがこれだけ欲しいってわかってるときに使うのかな・・・・

あ! なるほど。たしかに 書き換えるなら2行になりますね。 なんという落とし穴!

( )のくだりですが、、
print とか echo とか 確か関数じゃないのに( )付けれるんですよね。。。 まあ、あったところで、特に問題ないように 思うのですが、、、 なにか 多くの書物で これらは 関数じゃないですけど ( ) を付けることを 許しています とだけあって、 その理由がのってないんですよねぇ。。。 たんに見た目にわかりやすいように というだけなんでしょうか・・・

あと、Perl の 関数で &あっても なくても文脈で判断してくれると ありますが、、あれも なんか納得いかないですねぇ 結局 どっちにすべきなんだと。。。 できましたら この辺り トラバでよろしくお願いします。



2006/12/12 (火) 02:25:30|URL |#-
アベント
遅レスすいません m(_,_)m
> Javaというのはnewのことですか?
その通りです。多分、mallocがあると変な風にメモリを確保しちゃう可能性があって困る、ってのが理由だと思います。
2006/12/19 (火) 20:27:16|URL |#CfFZ5oX2
ビンゴ中西
おお
やはり そうでしたか ( ̄ー ̄)ニヤリッ
2006/12/20 (水) 03:26:26|URL |#-
長月葵
 通りすがりの者ですが。
 sizeof演算子はかっこ要らないですよ。
 正しく言うと、オブジェクト (メモリ上に実体を持った変数) に対するsizeofはかっこつけなくていいです。対して型に対してのsizeofはかっこが必要です。
 なぜこうなったのかという歴史的経緯はわかりませんが、過去にパーザを作った経験から言うと、sizeof演算子に続く型名が変数等の宣言 (定義) なのかそうでないのかを区別するのに手っ取り早いからなんじゃないかと思います。
2007/04/30 (月) 22:21:39|URL |#-
コメントを投稿する
Name:
URL:
Comment:

秘密:管理者にだけ表示を許可する
トラックバック
この記事のトラックバックURL
この記事にトラックバックする(FC2ブログユーザー)
関数と演算子についてちょっとだけ深く知りたい人のために。 ビンゴ中西のほげほげ malloc or calloc ややこしいが sizeは具体的に10とかの数字で、 sizeof( ) は演算子であることに注意! 演算子なのに( )が付くのはPerlやPHPと同じ配慮だと思っておこう・・・  実は
2006/12/13(水) 15:39:04 | deq blog
ブログ検索

プロフィール

ビンゴ中西
Perlが好きである。
プログラミング言語のほとんどは独学。独学の過程で多くのプログラム仲間にも色々教わりました。

FC2カウンター

カレンダー

09 | 2017/10 | 11
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -

ブロとも申請フォーム

この人とブロともになる

| ホーム |
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。