
/*ネットの*/
w = (double **)malloc(sizeof(double*) * h);
w[0] = (double *)malloc(sizeof(double) * v * h);
for(i=0; i<h; i++) w[i] = w[0] + i *v;
/*自分の*/
w = (double **)calloc(h, sizeof(double *));
for(i = 0; i < h; i++){
w[i] = (double *)calloc(v, sizeof(double));
自分は初心者です。自分は下のようなコードで書いていたのですが
ネットで見つけたコードで上のようにデータの領域を全部確保してから
2番目以降のポインタを割り当てるようなやり方をしていました。
そのやり方は初めて見たのですが、こっちのほうが一般的なやり方なんでしょうか?
それと何かメリットはあるんでしょうか?
一度に確保した方が確実に連続領域に割り当てられるとかかなぁとか予想してるんですが・・・
No.6
- 回答日時:
「2次元配列に値を代入するまでちょっと時間差があるので初期化されてた方が安心かな」ということだけど, もし本当にそんなことを言うようなら書き直しをさせそうな気がする. そもそも「時間差」なんて関係ないよね.
ちなみに, どのような値で「初期化」されるかわかっていますか? その値は適切ですか?
あと, 規格に従う限り sizeof(char) は必ず 1 です>#5. ただし, ぎりぎりいうと「アライメントをあわせるのにビットアンドを使うのが妥当か」というと困る.
アライメントまわりは「一昔前の 32ビットアドレスの RISC」なら (ほぼ) 必ず言及されることだったりするんで, どうしても気になっちゃうんだよね....
No.5
- 回答日時:
Itaniumの32ビットモードだとアライメントの問題起こすのは確かです。
>#2アライメントを考慮するなら
size_t siz = (sizeof(double *) * h + sizeof(double) - 1) & ~(sizeof(double) - 1);
w = (double **)malloc(siz + sizeof(double) * v * h);
w[0] = (double *)(((char *)w) + siz);
for (int i = 1; i < h; i++) {
w[i] = w[i - 1] + v;
}
になるのかなぁ。
sizeof(char)==1を期待してるのは、それはそれで問題なんだろうけど。
No.3
- 回答日時:
#1 の方法だと
・double * は 4バイトかつ 4バイトアライン
・double は 8バイトかつ 8バイトアライン
という環境でかつ h が奇数のときに死にます. 今どきそんな環境があるかどうかは知りません (し将来的にそれに類似する環境が発生するかどうかもわかりません) が, かつてあったことも事実.
あと, calloc を使うことによる「安心感」がどのようなものか, 説明できますか? 説明できるなら calloc でも malloc でも好きな方を使えばいいですが, もし説明できないとしたら危ないかもしれませんよ.
なるほど...
正直callocについてはよくわかってないです。ただ2次元配列に値を代入するまで
ちょっと時間差があるので初期化されてた方が安心かなとよくわかってないながら思っただけです。
どう危ないか教えて頂けるとありがたいです。
No.1
- 回答日時:
>それと何かメリットはあるんでしょうか?
malloc()といえど何らかの処理コストがありますし呼び出し回数が少ない方が処理時間は少なくなります(体感はできないでしょうけど)。
またヒープの管理領域分の節約にもなります。
でも更に突き詰めるなら
w = (double **)malloc(sizeof(double *) * h + sizeof(double) * v * h);
w[0] = (double *)(w + h);
for (int i = 1; i < h; i++) {
w[i] = w[i - 1] + v;
}
じゃないかなぁ。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
c言語で、繰り返し文の中で、0....
-
doubleの変数にintとintの割り...
-
数値を指数部と仮数部に分離したい
-
^この記号を使わない
-
C言語でsqrt(a^2+b^2)のテーブ...
-
doubleは常に%lfとするべきなのか
-
至急です! マクロ定義で #defi...
-
C 開放してるのにエラー(doubl...
-
最早開始時間と最遅完了時刻を...
-
【C++】関数ポインタの使い方
-
既定のコンストラクタがありま...
-
Aの値からBの値を除するとは??
-
「Aに対するBの割合」と「Aに対...
-
信頼区間の1.96や1.65ってどこ...
-
a^2の√=a が成り立たない場合
-
VB6.0での小数点の扱いについて
-
配列をnビットシフトする
-
数学 一次関数 関数 y=-3/4x+k(...
-
c languageで 簡単な質問があ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
C 開放してるのにエラー(doubl...
-
c言語で、繰り返し文の中で、0....
-
doubleの変数にintとintの割り...
-
至急です! マクロ定義で #defi...
-
C言語 関数プロトタイプ宣言の...
-
浮動小数点の定数
-
DWORDの警告
-
C言語の型による処理速度の違い
-
C言語で台形公式を使った二重積...
-
C言語を実行すると-infが出てき...
-
int とdoubleの比較
-
C言語初心者 構造体 課題について
-
たくさんの数の平均を求める方...
-
EXE1→DLL→EXE2数値を受け渡す方法
-
プログラミングでのテイラー展開
-
C++初心者です。簡単なスコア計...
-
【C言語】二階微分方程式をル...
-
fgets()による繰り返し入力(c言語)
-
2分法で方程式の複数の解を自...
おすすめ情報