C言語
NULLの扱い方
安全にポインタの指す先にアクセスできるのは、「確保したメモリを指している状態」のみ
プログラムで判断できるのは、「NULL を指している状態」か「それ以外」かのみ
「不定アドレスを指している状態」になった瞬間にポインタに NULL を指させる
「解放したアドレスを指している状態」になった瞬間にポインタに NULL を指させる
不定値を指した状態になったらNULLを指させる
int *p = NULL;
と、free 直後に必ずポインタに NULL を代入すること、
解放したメモリを指した状態になったらNULLを指させる
free(p);
p = NULL;
gcc限定
桁落ちを回避するためには,計算手順を考え直して, 大きさの近い2数の引き算を避けるようにするしかない.
絶対値が大きな値と小さな値とを加えた場合,小さい方の数値がもつ情報が失われる. たとえば, float 型の精度は約6桁であるから,float 型の数値 77777.7 と 1.23456 とを加えると, 結果も6桁であるから, 77778.9 となる.すなわち, 1.23456 がもつ情報のうちの下4桁の情報が失われている.
出力フォーマット指定子
https://gyazo.com/32cf253fd9e2d4aad0eae4de92ba5067
yahoo知恵袋ってわりとしっかりした回答を見つけるときがある
「0x0000000A」の「0x」は、
「これは16進数ですよー」と、C言語に教えることを意味します。
たとえば、「123」という数字。
これは10進数ならただの「123」ですが、
もし、これが16進数だったら、
10進数に直したとき、「291」にという数字になってします。
10進数と16進数の区別をハッキリさせるためにC言語の作者は
16進数には「0x」をつけなさい、というルールを作りました。
printf("a = %08X\n~a = %08X\n",a,~a);についててですが、
%c---文字 char
%d---整数 int
%f---実数 float
と、いろいろありましたよね。
そして、
%X---変数の中身を16進数で表示。だけどA~Fは大文字にしてね。
%x---変数の中身を16進数で表示。だけどA~Fは小文字にしてね。
と言う意味です。
「%08X」みたいに「%」と「dとかfとかX」との間に指定されている文字入れると
表示の方法を変えるコトができます。
これはC言語が持ってるprintfのスーパー能力のうちのひとつで、
たとえばこの場合、「08」ですよね?
これは「絶対に8ケタで表示、足りない部分は0で埋めてね」って意味です。
たとえば、
a=255;
16進数に直すと255=0xff
これをそのprintfの能力で表示すると、
000000FFとなります。
もし、aに入ってる数字が16進数でABCDEFとかなら、
00ABCDEF
1234567899桁で8桁オーバーしてますが、この場合、
123456789
と、フツーに表示されます。
https://gyazo.com/c2c92193392c01ef0f95bc82bb6821a9
共用体(union)
ビットフィールド
割り当てる領域を0bitにすることで、余った領域を使用不能にできる
https://gyazo.com/da2d98b7922e526e152d557094f80a36
ビットフィールドのメンバがメモリの後側から配置されるの、x86がリトルエンディアンだから
共用体もおなじっぽい
バイト列
デバッグ方法
https://gyazo.com/6737542841f723db1dbbc01489c1fe15
時間計測
ベンチマーク - C, C++, Objective-C, Java, Scala, Ruby, Python!
Linuxでの実行時間の計測には、clock_gettime(CLOCK_REALTIME, ×pec) を使うといいようだ
code:main.c
struct timespec ts1, ts2;
clock_gettime(CLOCK_REALTIME, &ts1);
// 計測したい処理
clock_gettime(CLOCK_REALTIME, &ts2);
printf("use loop countertime: %10ld.%09ld CLOCK_REALTIME\n", ts2.tv_sec - ts1.tv_sec, ts2.tv_nsec - ts1.tv_nsec); 文字列型(char*)の配列をループさせるやつ
code:hoge.c
// Keywords
static char *kw[] = {"return", "if", "else"};
for (int i = 0; i < sizeof(kw) / sizeof(*kw); i++)
{
}