2014.09.30 Tuesday
メモリを動的確保する関数の作成について(C言語)
妻のブログの方では既に報告されているが、家を建てることにした。
子供が産まれてアパートが手狭になったことがきっかけだ。
ずっと賃貸暮らしを続ける予定だったのだが、それなりの広さがあって猫okという物件はそれほどないだろうということで決断した。
住宅に関しては知らないことだらけで色々勉強した。
住宅ローンについても少し勉強した。
月々の返済額の計算法くらい知らないと恥ずかしくて銀行の担当者に会えない!と思って計算してみたりした。
ハウスメーカーの担当者の方が電卓で簡単に計算していたので簡単だと思ったら結構ややこしかった。
というか数百乗を計算しなければならないので普通の電卓ではほぼ無理だ。
関数電卓ならいける。ハウスメーカーの方が使っていたのはローン計算機能付きの電卓だったようだ。
住宅ローン控除や繰り上げ返済を考慮した簡単なローンシミュレータも作った。
シミュレータについては公開予定なし。
月々の返済額の公式の導出はupする予定。僕がupしなくてもどっかにあると思うけど。
シミュレータは今のところ固定金利で計算しているので変動金利にも対応させる予定。
乱数を入れてシミュレーションすると面白そう。
////////////////////////
時々メモリを動的確保する関数はどういう風に書けばいいのか迷うことがあるのでここでまとめておく。
次のようなことは出来ない。
#include <stdio.h>
#include <stdlib.h>
#define N 10
void f(int *a)
{
a = (int*)malloc(sizeof(int)*N);
}
int main()
{
int *a;
f(a);
return 0;
}
main関数のint *aは最初どこも指していない。
main::a->?
これが関数fの引数として渡されるとmain::aと同じアドレスを
指すf::aが生成される。
main::a->?
f::a->?
関数fの中でmallocすると
main::a->?
f::a->確保された領域の先頭アドレス
結局main::aは不定アドレスを指したまま。
ではどうしたらよいか。次のようにすればよい。
#include <stdio.h>
#include <stdlib.h>
#define N 10
void f(int **a)
{
*a = (int*)malloc(sizeof(int)*N);
}
int main()
{
int *a;
f(&a);
free(a);
return 0;
}
最初は
main::a->?
f関数にmain::aのアドレスを引数として渡せば
f::a->&(main::a)
もしくは次のようにする。
#include <stdio.h>
#include <stdlib.h>
#define N 10
int* f()
{
int *a = (int*)malloc(sizeof(int)*N);
return a;
}
int main()
{
int *a;
a = f();
free(a);
return 0;
}
f::a->領域確保された先頭アドレス
return aすると領域確保された先頭アドレスが戻る。
f::a自体は解放されてしまうがその前にmain::aに
領域確保された先頭アドレスが格納されるので問題ない。
子供が産まれてアパートが手狭になったことがきっかけだ。
ずっと賃貸暮らしを続ける予定だったのだが、それなりの広さがあって猫okという物件はそれほどないだろうということで決断した。
住宅に関しては知らないことだらけで色々勉強した。
住宅ローンについても少し勉強した。
月々の返済額の計算法くらい知らないと恥ずかしくて銀行の担当者に会えない!と思って計算してみたりした。
ハウスメーカーの担当者の方が電卓で簡単に計算していたので簡単だと思ったら結構ややこしかった。
というか数百乗を計算しなければならないので普通の電卓ではほぼ無理だ。
関数電卓ならいける。ハウスメーカーの方が使っていたのはローン計算機能付きの電卓だったようだ。
住宅ローン控除や繰り上げ返済を考慮した簡単なローンシミュレータも作った。
シミュレータについては公開予定なし。
月々の返済額の公式の導出はupする予定。僕がupしなくてもどっかにあると思うけど。
シミュレータは今のところ固定金利で計算しているので変動金利にも対応させる予定。
乱数を入れてシミュレーションすると面白そう。
////////////////////////
時々メモリを動的確保する関数はどういう風に書けばいいのか迷うことがあるのでここでまとめておく。
次のようなことは出来ない。
#include <stdio.h>
#include <stdlib.h>
#define N 10
void f(int *a)
{
a = (int*)malloc(sizeof(int)*N);
}
int main()
{
int *a;
f(a);
return 0;
}
main関数のint *aは最初どこも指していない。
main::a->?
これが関数fの引数として渡されるとmain::aと同じアドレスを
指すf::aが生成される。
main::a->?
f::a->?
関数fの中でmallocすると
main::a->?
f::a->確保された領域の先頭アドレス
結局main::aは不定アドレスを指したまま。
ではどうしたらよいか。次のようにすればよい。
#include <stdio.h>
#include <stdlib.h>
#define N 10
void f(int **a)
{
*a = (int*)malloc(sizeof(int)*N);
}
int main()
{
int *a;
f(&a);
free(a);
return 0;
}
最初は
main::a->?
f関数にmain::aのアドレスを引数として渡せば
f::a->&(main::a)
もしくは次のようにする。
#include <stdio.h>
#include <stdlib.h>
#define N 10
int* f()
{
int *a = (int*)malloc(sizeof(int)*N);
return a;
}
int main()
{
int *a;
a = f();
free(a);
return 0;
}
f::a->領域確保された先頭アドレス
return aすると領域確保された先頭アドレスが戻る。
f::a自体は解放されてしまうがその前にmain::aに
領域確保された先頭アドレスが格納されるので問題ない。