LoginSignup
1
2

More than 1 year has passed since last update.

C言語のstatic がメモリを保つことの検証実験

Last updated at Posted at 2022-04-23

目的

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言語の仕様についての言及があったので、そちらの方を先に参考してから記事を出した方がよかったですね。ご指摘ありがとうございます。

1
2
7

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2