質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

419閲覧

main関数の実行順序がわからない

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/03/22 04:06

以下のコードを実行すると実行結果になるのですが、xを全部表示して、x=1からmain() = 0に移るのですが、そこのところが分かりません。debugすると
(gdb) step
19 }
(gdb) step
main() = 0
14 v++;
(gdb) step
のところがわかりません。19行から14行にどうして行くのかが分かりません。
教えてください。お願いいたします。

コード //関数の再帰呼び出し #include <stdio.h> int main(void) { static int x=5; static int v=0; if(--x > 0){ printf("x = %d\n",x); printf("main() = %d\n",main()); v++; return (v); }else{ return (0); } } /* 実行結果 naka@naka ~/meikaicjs/chap13 $ gcc -o list13_3 list13_3.c -Wall naka@naka ~/meikaicjs/chap13 $ list13_3 x = 4 x = 3 x = 2 x = 1 main() = 0 main() = 1 main() = 2 main() = 3 naka@naka ~/meikaicjs/chap13 $ gcc -g list13_3.c -o list13_3 -Wall nakamura@nakamura ~/meikaicjs/chap13 $ gdb list13_3 GNU gdb (GDB) 7.6.1 Copyright (C) 2013 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "mingw32". For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>... Reading symbols from C:\MinGW\msys\1.0\home\nakamura\meikaicjs\chap13\list13_3.exe...done. (gdb) b main Breakpoint 1 at 0x40146e: file list13_3.c, line 10. (gdb) r Starting program: C:\MinGW\msys\1.0\home\nakamura\meikaicjs\chap13/list13_3.exe [New Thread 11688.0x1cf0] [New Thread 11688.0x1f0c] [New Thread 11688.0x11d0] [New Thread 11688.0x1528] [New Thread 11688.0xc50] [New Thread 11688.0x16b4] [New Thread 11688.0x1a88] Breakpoint 1, main () at list13_3.c:10 10 if(--x > 0){ (gdb) step 11 printf("x = %d\n",x); (gdb) step x = 4 12 printf("main() = %d\n",main()); (gdb) step main () at list13_3.c:6 6 { (gdb) step Breakpoint 1, main () at list13_3.c:10 10 if(--x > 0){ (gdb) p x $1 = 4 (gdb) step 11 printf("x = %d\n",x); (gdb) step x = 3 12 printf("main() = %d\n",main()); (gdb) step main () at list13_3.c:6 6 { (gdb) step Breakpoint 1, main () at list13_3.c:10 10 if(--x > 0){ (gdb) step 11 printf("x = %d\n",x); (gdb) step x = 2 12 printf("main() = %d\n",main()); (gdb) step main () at list13_3.c:6 6 { (gdb) step Breakpoint 1, main () at list13_3.c:10 10 if(--x > 0){ (gdb) step 11 printf("x = %d\n",x); (gdb) p x $2 = 1 (gdb) step x = 1 12 printf("main() = %d\n",main()); (gdb) step main () at list13_3.c:6 6 { (gdb) step Breakpoint 1, main () at list13_3.c:10 10 if(--x > 0){ (gdb) step [New Thread 11688.0x1b1c] 17 return (0); (gdb) step 19 } (gdb) step main() = 0 14 v++; (gdb) step 15 return (v); (gdb) step 19 } (gdb) step main() = 1 14 v++; (gdb) step 15 return (v); (gdb) step 19 } (gdb) step main() = 2 14 v++; (gdb) step 15 return (v); (gdb) step 19 } (gdb) step main() = 3 14 v++; (gdb) step 15 return (v); (gdb) step 19 } (gdb) step 0x00401288 in __register_frame_info () (gdb) Single stepping until exit from function __register_frame_info, which has no line number information. 0x0040128f in __register_frame_info () (gdb) q A debugging session is active. Inferior 1 [process 11688] will be killed. Quit anyway? (y or n) y error return ../../gdb-7.6.1/gdb/windows-nat.c:1275 was 5 naka@naka ~/meikaicjs/chap13 $ */

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

関数を呼び出すときは、その時点の実行ポインタをスタックにPushして関数に制御が移ります
そして、その関数が終了した場合、スタックをPopして直前の実行アドレスに戻ります

ということで、スタック、あるいはスタックポインタというものを理解する必要があります。
まずはこのキーワードでぐぐってみましょう

投稿2018/03/22 04:21

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/03/22 04:36

ありがとうございます
guest

0

ベストアンサー

19行から14行にどうして行くのかが分かりません。

C

1int main(void) 2{ 3 static int x=5; 4 static int v=0; 5 6 if(--x > 0){ 7 printf("x = %d\n",x); 8 printf("main() = %d\n",main()); 9 /* [1] x==1でmainを呼ぶと */ 10       /* [3] returnの戻りはココ */ 11 v++; 12 return (v); 13 }else{ 14 return (0); /* [2] この行に到達し、returnする */ 15 } 16}

投稿2018/03/22 04:20

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/03/22 04:51

ありがとうございます。なんとなくわかりました。実行した関数の次に戻るんですね。 printfがmain()関数を呼び出して、スタックにmain()を入れていき、最後に帰ってきた0を最後に入れた main()の戻り値にいれて、残っているmain()を取り出しながら、戻り値を入れて、表示しているんですね。 4回main()をよびだしているので、0,1,2,3となるんですね。 これで間違っていませんか。
episteme

2018/03/22 06:14

そゆことです。
退会済みユーザー

退会済みユーザー

2018/03/24 12:16

ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問