Upgrade to Pro — share decks privately, control downloads, hide ads and more …

C言語を知らない人がびっくりしそうなC言語の特徴 ~変数定義編~

C言語を知らない人がびっくりしそうなC言語の特徴 ~変数定義編~

以下動画のテキストです。
https://youtu.be/g7ZcZTkOAl4

Avatar for Satoru Takeuchi

Satoru Takeuchi

January 17, 2023
Tweet

More Decks by Satoru Takeuchi

Other Decks in Technology

Transcript

  1. サンプルコード2 1. foo()を呼ぶ 1.1. 変数iを定義して100で初期化 2. bar()を呼ぶ 2.1. 変数iを定義して初期化はしない 2.2.

    iの値を表示 • 実行結果はどうなる? ◦ 現代的な言語なら0になりそう #include <stdio.h> void foo(void) { int i = 100; } void bar(void) { int i; printf("%d\n", i); } int main(void) { foo(); bar(); }
  2. スタックの説明(1/4) #include <stdio.h> void bar() { int i = 100;

    } void foo() { int i = 10; bar(); } void main() { int i = 1; foo(); } メモリ スタック … … いろいろ mainのiの値(1) 0 大きい アドレス 📝 戻りアドレスとか フレームポインタとか
  3. スタックの説明(2/4) #include <stdio.h> void bar() { int i = 100;

    } void foo() { int i = 10; bar(); } void main() { int i = 1; foo(); } メモリ スタック … … いろいろ mainのiの値(1) 0 大きい アドレス fooのいろいろ fooのiの値(10) push
  4. スタックの説明(3/4) #include <stdio.h> void bar() { int i = 100;

    } void foo() { int i = 10; bar(); } void main() { int i = 1; foo(); } メモリ スタック … … いろいろ mainのiの値(1) 0 大きい アドレス fooのいろいろ fooのiの値(10) barのいろいろ barのiの値(100) push
  5. スタックの説明(3/4) #include <stdio.h> void bar() { int i = 100;

    } void foo() { int i = 10; bar(); } void main() { int i = 1; foo(); } メモリ スタック … … いろいろ mainのiの値(1) 0 大きい アドレス fooのいろいろ fooのiの値(10) ゴミ ゴミ(100) pop
  6. スタックの説明(3/4) #include <stdio.h> void bar() { int i = 100;

    } void foo() { int i = 10; bar(); } void main() { int i = 1; foo(); } メモリ スタック … … いろいろ mainのiの値(1) 0 大きい アドレス ゴミ ゴミ(10) ゴミ ゴミ(100) pop
  7. サンプルコード2の挙動の説明 #include <stdio.h> void foo(void) { int i = 100;

    } void bar(void) { int i; printf("%d\n", i); } int main(void) { foo(); bar(); } メモリ スタック … … いろいろ 0 大きい アドレス
  8. サンプルコード2の挙動の説明 #include <stdio.h> void foo(void) { int i = 100;

    } void bar(void) { int i; printf("%d\n", i); } int main(void) { foo(); bar(); } メモリ スタック … … いろいろ 0 大きい アドレス fooのいろいろ fooのiの値(100) push
  9. サンプルコード2の挙動の説明 #include <stdio.h> void foo(void) { int i = 100;

    } void bar(void) { int i; printf("%d\n", i); } int main(void) { foo(); bar(); } メモリ スタック … … いろいろ 0 大きい アドレス ゴミ ゴミ(100) pop
  10. サンプルコード2の挙動の説明 #include <stdio.h> void foo(void) { int i = 100;

    } void bar(void) { int i; printf("%d\n", i); } int main(void) { foo(); bar(); } メモリ スタック … … いろいろ 0 大きい アドレス barのいろいろ barのi(100) push 初期化していないので fooのゴミが残っている!