読んだ本
読んだ背景
業務で使うため。経験者だがブランクが結構あるので、勉強し直そうと思った。
感想
- C言語の勉強し直しに良かった
- 過去の実務でもC言語を使っていたが、割とあさーい理解のままやっていたのと、ブランクがかなりあるのでちょうど良かった。
- 「先に知っておくべきこと」をざっと学べた
- C言語は、低レイヤーな部分を触れるので、あらかじめ知っておかなければ、安全に使えないネタが多い。
- 勉強の次のポインタが得られた
- BSD, Linuxなどのソースコードを読んでみる(strtok, printf, headなどを読んでみる)
印象に残った点
- char text[14] = “hello, world\n”;の時、”hello〜”は、静的領域におかれる。そしてtextの定義時に配列に値がコピーされる
- aとbのswapはa^=b; b^=a; a^=b;でできる(tmp変数要らず)
- -Wallオプションがないと、プロトタイプ宣言なし→引数の型不一致でも動いてしまう(暗黙の型変換せず。)
- (感想)標準ライブラリで、スレッドセーフではないものが多い理由。C#のようにインスタンスに紐づかないので、ライブラリ側でstaticに変数を保持しているからか。インスタンスに状態をもてない。
- (感想)標準入出力の”標準”って何やねん、と思ってたが、Unix系ではデバイスをファイルとして抽象化する文化であり、それらとの入出力の”標準”だという意味っぽい。
- 「Javaであれば環境も含めてJava」でもCはそうでない。だから、自分の使っている環境について理解を深める必要がある、と言う話がしっくりきた。
- malloc, calloc, realloc。callocはサイズかける要素数かつ初期化あり。reallocは取れたかどうかチェックしてから、ポインタを差し替えること
- double num_array[20];の時、num_array[2]は2[num_array]と書いても同じ動作になる(ポインタ演算して中身を読むののシンタックスシュガーだから)と言うのは知らなかった。
- memset, バイト単位なので注意。
- パディングについて。処理系, 32bitOS/64bitOSによって、4byte, 8byte単位でアクセスする。そのため、この二度アクセスしないと行けない状態を避けるため、パディングが入る。
- memcmpは構造体の比較に使うと、パディング領域も比較されてしまう。(メンバごとに比較することを勧めているように読めた)