アトミックとは
ある操作に対して、他者が割り込めないこと。
アトミックにするには、ロック操作が必要であるが、OSの機能によってはアトミックが保障されておりロック操作不要なものもある。
C言語: NULLポイント
ポインタ変数は宣言直後はでたらめな値が格納されているので、このまま利用するのはバグとなり危険。
これを防ぐために、アドレスを代入したかどうかを区別する必要がある。
NULL
をポインタ変数に代入しておくことで、区別をつけることができる。
- 書き方
int *p = NULL;
- サンプル
1 #include <stdio.h> 2 3 int main(void) 4 { 5 int *p = NULL; 6 if (! p) { 7 printf("p = Null\n"); 8 } 9 int i; 10 p = &i; 11 if (p) { 12 printf("p = Not null\n"); 13 printf("p = %p\n", p); 14 } 15 return 0; 16 }
- 実行結果
# ./a.out p = Null p = Not null &i = 0x7fff5690b83c
C言語: ポインタ、事はじめ
ポインタ型
アドレスを記憶する変数の型。 他の型と合体して型を生成する。
ポインタ値
変数のアドレスの値のこと。
ポインタ変数の宣言
int *p; int* p;
どちらも同じ。
int* p1, p2;
と書いた場合、p2
はint型になる。そのため、変数の前に*
をつけて明示してあげたほうが良さそう。
アドレスを代入
#include <stdio.h> int main(void) { int *p, i; p = &i; printf("p = %p\n", p); printf("&i = %p\n", &i); return 0; }
上記をコンパイルして実行すると以下の通りとなる。
# ./a.out p = 0x7fff535df83c &i = 0x7fff535df83c
C言語: メモリーのアドレスを知る。
変数が格納されている、メモリ上のアドレスを知るには printf
に %p
で表示できる。
変数には、&
をつける。配列のアドレスを知りたい場合は、&
は不要。
#include <stdio.h> int main(void) { int i1, i2, i3; printf("i1(%p)\n", &i1); printf("i2(%p)\n", &i2); printf("i3(%p)\n", &i3); int array[10]; printf("array___(%p)\n", array); printf("array[0](%p)\n", &array[0]); printf("array[1](%p)\n", &array[1]); printf("array[2](%p)\n", &array[2]); return 0; }
コンパイル後、実行結果。
# ./a.out i1(0x7fff510de818) i2(0x7fff510de814) i3(0x7fff510de810) array___(0x7fff510de820) array[0](0x7fff510de820) array[1](0x7fff510de824) array[2](0x7fff510de828)
10進数にすると、4バイトで区切られていることがわかる。 これは、int型が4バイトであるため。
C言語のプロトタイプ宣言
自作関数を作成する。 sum
関数を作成する。
#include<stdio.h> int main(void) { sum(); /* sum関数を呼び出す */ return 0; } int sum(void) { printf("%d\n", (1 + 100) * 100 /2); return 0; }
これをコンパイルしてみると以下のようなエラー。
sample2.c:6:5: warning: implicit declaration of function 'sum' is invalid in C99 [-Wimplicit-function-declaration] sum(); /* sum関数を呼び出す */ ^ 1 warning generated.
sum
関数がmain
より後ろに記述されているため、エラーとなった。このエラーを解決するには、最初にこの関数が存在することを明記する必要がある。
以下の通り記述する。
#include<stdio.h> int sum(void); /* プロトタイプ宣言 */ int main(void) { sum(); /* sum関数を呼び出す */ return 0; } int sum(void) { printf("%d\n", (1 + 100) * 100 /2); return 0; }
そして、コンパイルすると成功した。
C言語サンプル
「苦しんで覚えるC言語」というとんでもない題名の本で勉強を始める。
C言語の初歩。「Hello World」を表示する。 ファイル名は sample.c
とした。
#include<stdio.h> int main(void) { printf("Hello, World"); return 0; }
コンパイルする。
gcc sample.c
# ls -l total 32 -rwxr-xr-x 1 atani staff 8432 4 9 01:26 a.out -rw-r--r-- 1 atani staff 79 4 9 01:08 sample.c
a.out
というファイルができる。
実行してみる。
# ./a.out Hello, World%
出来た。