目的
static がメモリを保持するとはなんぞや?ということを疑問に思ったので、実験してみた。
個人用の記録です。
環境
機種: MacBook Pro 2018
プロセッサ: 2.3GHz Quad-Core Intel Core i5
メモリ: 8GB
clang
$ clang -v
Apple clang version 13.1.6 (clang-1316.0.21.2.3)
コード
#include<stdio.h>
int* f(void) {
static int x = 0;
// int x = 0; // 比較用
x = x + 1;
printf("&x = %p\n", &x);
return &x;
}
int main(void) {
int *s = f();
int *l = f();
printf("&s = %p\n", s);
printf("&l = %p\n", l);
printf("%d\n", *s);
return 0;
}
(2022/04/25)フォーマット指定子が間違っていたので、%x→%pへ修正
結果
static int x で宣言した方の出力:
&x = 0x10edf2010
&x = 0x10edf2010
&s = 0x10edf2010
&l = 0x10edf2010
2
(auto) int x で宣言した方の出力:
&x = 0x7ff7b246e28c
&x = 0x7ff7b246e28c
&s = 0x7ff7b246e28c
&l = 0x7ff7b246e28c
-362620741
(2022/04/25)%xでの表示結果から%pでの表示結果に変更。
考察
static で修飾した方はメモリの中身が書き換えられていないが、修飾していない方はメモリの中身が書きかわっている。static はメモリを確保したら、プログラムが動いている間はその領域を確保したままにするという修飾子なんだろうと考えられる。
また、static を宣言した方は、1 が結果として返ってきてほしいのに 2 が返ってきている。これは、static でメモリ領域を確保すると、一回目で確保している領域を初期化せず書き換え続けるというのが実装で決められていると考えられる。正しいかどうかはわからない。
感想
ポインタ楽しい。
追記
(2022/04/25)
コメントでC言語の仕様についての言及があったので、そちらの方を先に参考してから記事を出した方がよかったですね。ご指摘ありがとうございます。