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

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

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

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

解決済

segmentation faultがなぜ起こっているのか分からない

MF0524
MF0524

総合スコア45

C

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

3回答

0評価

0クリップ

289閲覧

投稿2022/04/28 06:08

編集2022/05/05 13:27

発生している問題

現在Cで書かれたプログラムの修正中で、下記のような簡略化したコードを検討しています。
コード自体は実行できる(期待した値が出力される)のですが、vscodeでデバッグをしているとwhile文の部分でsegmentation faultが起こっていると警告が出ます。
ただ、コードを見てもどうしてsegmentation faultが起こっているのかが分かりません。
どなたか解決策を教えていただけないでしょうか?

実行環境

vscodeよりデバッグを実行
wsl2 ubuntu-20.04
コンパイラ: gcc 9.3.0
デバッガ: gdb 9.2

検討しているコード

4行3列のデータが格納されているcsvファイルを読み込み、その値をコンソール上に出力するようなプログラムを書いています。
デバッグなしで実行した場合、期待通りの出力が行われます。
一方で、デバッグを行うと「while(fgets(line, N, fp) != NULL){」の部分でsegmentation faultが起こっていると出力されます。
以下が検討しているコードになります。

C

#include <stdio.h> #include <stdlib.h> #define N 256 //1行の最大文字数(バイト数) //csvファイルを読み込むための構造体dataの作成。1行当たり3つの値を格納 typedef struct str { double f_value[3]; } data; int main(void){ FILE *fp; char fname[] = "test.csv"; char line[N]; double f1, f2, f3; int i = 0; data data[4]; int x, y, j; fp = fopen(fname, "r"); //読み込んだcsvファイルを1行ずつ取り出し、各列ごとの値をdataに追加していく while(fgets(line, N, fp) != NULL){ sscanf(line, "%lf,%lf,%lf", &f1, &f2, &f3); double tmp[] = {f1, f2, f3}; for(j = 0; j < sizeof(data[i].f_value) / sizeof(data[i].f_value[0]); j++) { data[i].f_value[j] = tmp[j]; } i++; } fclose(fp); //読み込んだファイルの中身をコンソール上へと出力 for(x=0;x<4;x++) { for(y=0;y<3;y++) { printf("%lf\n", data[x].f_value[y]); } } return 0; }

vscodeのデバッグの設定

設定ファイルにはlaunch.jsonとtasks.jsonがあります。
参考サイトを確認したところ、launch.jsonの書き方は恐らく問題ないと思います。
tasks.jsonの方は良さそうなサイトを見つけれなかったのですが、こちらに載っているものをそのまま使っていました。
実際に書いたものは以下です。
launch.json

{ // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes. // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "name": "gcc - Build and debug active file", "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/a.out", "args": [], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "console": "integratedTerminal", "MIMode": "gdb", "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": false } ], "preLaunchTask": "C/C++: gcc build active file", "miDebuggerPath": "/usr/bin/gdb" } ] }

tasks.json

{ "tasks": [ { "type": "cppbuild", "label": "C/C++: gcc build active file", "command": "/usr/bin/gcc", "args": [ "-g", "-O0", "${file}", ], "options": { "cwd": "${workspaceFolder}" }, "problemMatcher": [ "$gcc" ], "group": { "kind": "build", "isDefault": true }, "detail": "Task generated by Debugger." } ], "version": "2.0.0" }

test.csvの中身

5,1,0.2
10,5,0.02
50,0.1,0.01
100,5,10

以上になります。よろしくお願い致します。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

tatsu99

2022/04/28 06:25

test.csvの内容を提示して下さい。
jimbe

2022/04/28 06:29

お聞きになりたいのは、Cコードのバグなのでしょうか、それとも vscode のデバックの設定なのでしょうか。
MF0524

2022/04/28 06:39

tatsu99様 ご指摘ありがとうございます。修正いたしました。 jimbe様 おおもとの問題は、上記で提示したよりも複雑なCのプログラムでバグがあり、それを解消したいと考えています。 そのバグの候補として上記のプログラムが関係しているのではないかと考えています。 そう考える理由はデバッグ時にエラーが出ているからです。 ただ、vscodeの設定に起因するエラーの可能性も考えられるため、設定ファイルの中身を示しています。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C

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