C言語 バッファオーバーランまで 関数の引数ポインタ
公開日:
:
Mac
関数引数としてのポインタ
今回は関数引数としてのポインタに関して。
バッファオーバーランを試す前に色々復習と予備知識を補います。
シリーズ
・C言語 バッファオーバーランまで ポインタ考察編
・C言語 バッファオーバーランまで 関数の引数ポインタ
動作環境
windows7 x86?
cygwin 1.7.16?
予備知識
・メモリの大まかな概念
10-3.ポインタと文字列
ソースコード
オライリー先生は優秀です。
優秀故に素人にはハードルが高い場合があります。
オライリー先生のソースコードにコメントと数行のソースコードを足しただけです。
#includevoid inc_count(int *count_ptr); int main(void); void inc_count(int *count_ptr) { // アドレス(ポインター)として引数を受け取り //「*count_ptr」を付け実態を参照、数をインクリメント ++(*count_ptr); } int main(void) { int count = 0; while (count < 10) // countの参照しているアドレス(ポインター)を引数として関数呼び出し inc_count(&count); // output [ 10 ] printf("count : %d", count); return 0; }
解説すると関数の引数に変数が参照しているアドレスを渡して、
関数側はアドレスの参照する実態の数をインクリメントする。
別にアドレスじゃなくて、引数にそのまま数を渡せば良いのでは?
と思ったら思考回路はショート寸前です。はい。自分の事ですが何か?
ダメソースコード
C言語はまだまだ勉強中ですが、ぱっとみでこれは「ダメダナ(・x・)」
#includeint inc_count(int count); int main(void); int inc_count(int count) { ++(count); return count; } int main(void) { int count = 0; while (count < 10) count = inc_count(count); printf("count : %d", count); return 0; }
なんで「ダメダナ(・x・)」の理由は、
・返却値として受け取った値を代入し直してる。
・関数側でも返却値を呼び出される度に返却してる。
一昔前のマシーンではリソースが今程ではなかったので、ソースコードをいかに
スマートに書くかに重点が置かれてたらしいのですが?(※知ったかぶりです)
今は可読性を上げるほうが重要になってます。
この辺りがゆとり世代と言われる所以!?などと思ったりしなかったり?
実際はこんな単純な話ではないし、コード量が増えたりした場合
、構造体やオブジェクトを扱う場合はどうなるのか?
などの疑問は残りますが、知識を徐々に深めたいと思います。
次回
次回に続け!
関連記事
-
Macで ローカルサーバー構築 ローカルネットワーク参加編
Macで ローカルサーバー環境を構築するまで Apache設定編 ネットでの情報は必要最低限しか載
-
Macで ローカルサーバー構築 PHP設定編
Macで ローカルサーバー環境を構築するまで PHP設定編 ネットでの情報は必要最低限しか載ってな
-
Macで ローカルサーバー構築 Apache起動編
Macで ローカルサーバー環境を構築するまで Apache起動編 ネットでの情報は必要最低限しか載
-
Macで ローカルサーバー構築 Postfix基本編
Macで ローカルサーバー環境を構築するまで Apache起動編 ネットでの情報は必要最低限しか載
-
Macで ローカルサーバー構築 Apache設定編
Macで ローカルサーバー環境を構築するまで Apache設定編 ネットでの情報は必要最低限しか載