わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

昨年度の授業資料の間違い

ここのところ,人の本の間違いを指摘してばかりですが,自分の恥もさらしておきます.去年の授業で,覚えているのは:

  • 構造体の「定義」という書き方をしていますが,「宣言」が正しいです.「宣言」の中で,メモリ上にその実体が作られるのを特に「定義」と呼びます.関連情報:
    • C FAQの1.7の回答.
    • typedefは「型を定義」,と言いたいところですが,これも「定義」ではないことになります.()
    • 関数の処理を書くにも,その処理内容はメモリに落とし込まれるので「定義」ですが,関数プロトタイプは,メモリに反映されないので「宣言」です.
  • 配列の模式図で,ポインタを説明する前から,「参照先を変えられないポインタ」で表記していますが,これは誤解のもとです.この描き方では,「sizeof(配列変数)」を適切に説明できません.
  • (修正済みですが)バイト単位での単一換字暗号プログラムa simple substitution cipher programで,暗号化と復号の変換表をcharの配列としており,table->decrypt_table[table->encrypt_table[i]] = i; で不具合を起こす可能性がありました.すなわち,char型がsigned char型と同じであるとき,table->encrypt_table[i]がint型の負の数となり,table->decrypt_table[負の数] = i; という領域外アクセスが起こり得るのでした.