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

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

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

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

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のゴミが残っている!