- - PR -
C言語で初心者本を読んだ次の一手は?
投票結果総投票数:55 | |||
---|---|---|---|
ポインタを徹底的に | 47票 | 85.45% | |
コンパイル周辺を理解しろ | 3票 | 5.45% | |
関数群を叩き込め | 2票 | 3.64% | |
初心者本もう一冊? | 3票 | 5.45% | |
|
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-08-17 01:42
よく、 a += 1; という表現でインクリメントしていました。
しかし、C言語でのプログラミングを始めて数年も経た後、ある「捻くれた本」、、 「XXを256倍使う・・」シリーズ辺りか何か(本の名前は忘れてしまいました。)で、インクリ メントでないにせよ、 a =+ 1; という表現に出くわし、これでコンパイルエラーが出ない のか、と己の勝手な先入観を叩き潰されてショックを受けました。 | ||||||||||||
|
投稿日時: 2004-08-17 13:30
まぁ、捻くれていたのは私の方だったようですな(プ
勝手に「できない」と思い込んで。。。 a = +1; こうかけばまだ直感的に理解し易かったかも知れませんな。 ここ、面白ろおまっせ。 http://www.kouno.jp/home/c_faq/ | ||||||||||||
|
投稿日時: 2004-08-18 14:21
ご理解されたようですね。ただ、これでも動くでしょうが、AllocBufferの仮引数と実引数 の型をちゃんと合わせておきましょう。 #Cだと型チェックが甘いのでコンパイル通るでしょうが
初期化しないローカル変数の値は不定なので、偶然アクセス可能な領域を指している場合も あります。アクセス違反で落ちるよりも、下手に動いてしまってメモリ破壊をしてしまう方が やっかいなバグの原因になります。 | ||||||||||||
|
投稿日時: 2004-08-18 21:32
自動変数を使う場合の注意点ですね。 あと、自動変数はふつうスタックを利用して実現されていることを 知っていると、ひょっとしたら役に立つことがあるかも。 | ||||||||||||
|
投稿日時: 2004-08-19 14:16
はにまるです。
いやぁ案外、素直だから思い込んでいたのかもしれませんよ! 今の私は、「己の勝手な先入観」を叩き潰れまくっています。
課題の提供ありがとうございます。「己の勝手な先入観」が1つ叩き潰れました。 「己の勝手な先入観」と言うのは、 標準関数の受取引数がchar型ポインタ時に文字列を渡す場合、 「&」演算子の指定をしないですよね。 だから、関数側の引数がポインタ変数なのか普通の変数なのかによって 呼出側の処理で勝手に変数の値若しくはアドレスを渡しているものだと勘違いしていました。 そうです、文字列なので文字の配列だったんですね... おかげ様で、変数のアドレスと値をprintfする癖が付きました。
スタックって push & popの奴ですか? うんんん、どうやって利用するか想像出来ない... | ||||||||||||
|
投稿日時: 2004-08-19 15:07
セキュリティホールをつくのにとっても重要です。 # 冗談です、信用しないように。 | ||||||||||||
|
投稿日時: 2004-08-20 01:08
そうです。ここでは、アセンブラで push、pop するものを指しています。 詳しくは、なにか解説記事とか解説書とかを読んで頂くとして... # 「自動変数 スタック」で検索すればいろいろヒットすると思います。 このスタックは利用できる数に制限があるので、自動変数は無尽蔵に 使えるわけではありません。 ・・・というのが第一点で。 第二点は、なちゃさんが書かれていることですね。 セキュリティホールになってしまうので gets は絶対に使っちゃダメ、 とかの話です。 [ メッセージ編集済み 編集者: ぽんす 編集日時 2004-08-20 01:09 ] | ||||||||||||
|
投稿日時: 2004-08-20 14:01
一般的なデータ管理の手法としてのスタックではなく、処理系(通常はOS)が用意するスタック 領域の話です。たとえば関数呼び出しの場合は、そのスタック領域に関数からの戻り先の アドレスや引数の値を積んで(push)呼び出し、呼び出された関数は引数の値や戻り先の アドレスをスタックから取得(pop)して処理をおこないます。よくあるバッファオーバーラン によるセキュリティホールは、スタックに積まれた戻り先のアドレスを書き換えてしまうこと によって実行されます。 |