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

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

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

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

Q&A

解決済

3回答

1154閲覧

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

MF0524

総合スコア48

C

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

0グッド

0クリップ

投稿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

1#include <stdio.h> 2#include <stdlib.h> 3 4#define N 256 //1行の最大文字数(バイト数) 5 6//csvファイルを読み込むための構造体dataの作成。1行当たり3つの値を格納 7typedef struct str { 8 double f_value[3]; 9} data; 10 11int main(void){ 12 FILE *fp; 13 char fname[] = "test.csv"; 14 char line[N]; 15 double f1, f2, f3; 16 int i = 0; 17 data data[4]; 18 int x, y, j; 19 20 fp = fopen(fname, "r"); 21 //読み込んだcsvファイルを1行ずつ取り出し、各列ごとの値をdataに追加していく 22 while(fgets(line, N, fp) != NULL){ 23 sscanf(line, "%lf,%lf,%lf", &f1, &f2, &f3); 24 double tmp[] = {f1, f2, f3}; 25 for(j = 0; j < sizeof(data[i].f_value) / sizeof(data[i].f_value[0]); j++) { 26 data[i].f_value[j] = tmp[j]; 27 } 28 i++; 29 } 30 fclose(fp); 31 32//読み込んだファイルの中身をコンソール上へと出力 33 for(x=0;x<4;x++) { 34 for(y=0;y<3;y++) { 35 printf("%lf\n", data[x].f_value[y]); 36 } 37 } 38 return 0; 39} 40

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

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

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

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

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

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

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

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の設定に起因するエラーの可能性も考えられるため、設定ファイルの中身を示しています。
guest

回答3

0

自己解決

お世話になっています。
結局vscodeの設定が原因であると考えています。
設定ファイルのどこが原因でエラーが出ているのかは特定できていませんが、デバッガーのgdbをvscode経由で使用するのではなく、直接使用した場合エラーは出ませんでした。
そのため、原因はコードにあるのではなく、vscode上のgdbの設定にあると考えています。
お騒がせ致しました。皆様ありがとうございました。

投稿2022/05/05 04:27

MF0524

総合スコア48

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

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

0

fp の値が NULL なのではありませんか?

投稿2022/04/28 07:44

kazuma-s

総合スコア8224

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

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

MF0524

2022/04/28 07:57

ご回答ありがとうございます。初心者のため、いまいちデバッガの使い方に慣れていないのですが、おっしゃる通りでfpの値が恐らくnullになっています。fpがnullになってしまう原因が分からないのですが、上記のコード内に何か間違いがあるのでしょうか?また、nullになっていても読み込んだファイルは出力できるものなのでしょうか?
tatsu99

2022/04/28 08:04

ファイル名が相対パスなので、そのディレクトリ内にファイルがあればOKですが、ないとエラーになりfpがNULLになります。 ファイル名をフルパスで指定してはいかがでしょうか。 char fname[] = "test.csv"; ではなく、 char fname[] = "/home/xxx/yyy/test.csv"; のようにします。(ディレクトリは適当なのでこのまま使用しないでください)
tatsu99

2022/04/28 08:15

>また、nullになっていても読み込んだファイルは出力できるものなのでしょうか? fpがNULLになったら、なにもできません。そこでギブアップです。 通常は、fp = fopen(fname, "r"); のあとに if (fp == NULL){ printf("オープンエラー\n"); return 10; } のようにして、エラーの場合、処理を打ち切ります。
guest

0

デバッグしてるなら、iの値がどこまで行くのか見てみれば。
dataのサイズ越えてない?

投稿2022/04/28 06:20

y_waiwai

総合スコア87719

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

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

MF0524

2022/04/28 06:29

ご回答ありがとうございます。 while文のループがまだ開始されていない時点でのエラーのようで、iの値は0のままでした。 そのため、iの値がdataのサイズを超えるために出るエラーではないと思います。
y_waiwai

2022/04/28 06:36

ならそこらへんの詳しい説明を質問文に追記しよう
MF0524

2022/04/28 07:54

ご回答ありがとうございます。現在まとめているところです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問