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

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

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

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

WSL(Windows Subsystem for Linux)

WSL (Windows Subsystem for Linux) は、Windows10のOS上でLinux向けのバイナリプログラムを実行可能にする機能です。また、WindowsOSのAPIを用いた仕組みを提供しており、Linux側からWindowsOSへのファイルアクセスもできます。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

解決済

2回答

1145閲覧

構造体のメンバとしてサイズの大きな2次元配列を定義するとコアダンプしてしまう

PC_breakman

総合スコア30

C

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

WSL(Windows Subsystem for Linux)

WSL (Windows Subsystem for Linux) は、Windows10のOS上でLinux向けのバイナリプログラムを実行可能にする機能です。また、WindowsOSのAPIを用いた仕組みを提供しており、Linux側からWindowsOSへのファイルアクセスもできます。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

0クリップ

投稿2022/01/19 10:20

前提・実現したいこと

下記コード1のように2次元配列と右辺ベクトルを入力し、連立方程式
b=Ax
の解を求めるため、連立方程式に必要となる各種情報を持つ構造体を書いてmain内で宣言したのですが、コアダンプが起きてしまいました。コアダンプ発生の原因は「試したこと」に記載の通り判明していまして、構造体を用いたコードでもコアダンプを起こさないような改善方法があれば教えていただきたいです。もしなければグローバル宣言する方法(コード2)であればコアダンプが起きなかったのでそちらで作成します。また、なぜ構造体だとコアダンプが起きて、グローバル宣言だと起きないのかについても併せてご教示いただけますと幸いです。
よろしくお願いいたします。

発生している問題・エラーメッセージ

Segmantation fault(core dumped)

該当のソースコード

C(コード1)

1#include <stdio.h> 2#include <stdlib.h> 3#include <time.h> 4#include <math.h> 5#include <string.h> 6#include <ctype.h> 7 8#define SIZE 2000 9#define eps 1e-13 10 11// 連立方程式の情報を持つ構造体 12typedef struct { 13 int n; // 次元 14 double A[SIZE][SIZE]; // 係数行列 15 double x[SIZE]; // 解ベクトル 16 double b[SIZE]; // 右辺ベクトル 17} Equation; 18 19// 連立方程式を解く関数 20void solve(Equation e) // ここはもう完成していて質問意図と異なるので省きます 21{ 22} 23 24int main(void) 25{ 26 Equation eq; // ここでコアダンプが発生してしまう 27 solve(eq); 28 return 0; 29} 30

C(コード2)

1#include <stdio.h> 2#include <stdlib.h> 3#include <time.h> 4#include <math.h> 5#include <string.h> 6#include <ctype.h> 7 8#define SIZE 2000 9#define eps 1e-13 10 11// 連立方程式に必要な情報 12int n; // 次元 13double A[SIZE][SIZE]; // 係数行列 14double x[SIZE]; // 解ベクトル 15double b[SIZE]; // 右辺ベクトル 16 17// 連立方程式を解く関数 18void solve() // ここはもう完成していて質問意図と異なるので省きます 19{ 20} 21 22int main(void) 23{ 24 solve(); 25 return 0; 26} 27

試したこと

様々なトラブルシューティングを試みた結果、2次元配列Aを構造体から消去した場合コアダンプが起きなかったことから2次元配列Aが原因だとわかりました。また、配列サイズ数を1000にした場合コアダンプは起きませんでしたが、今回は1800*1800程度のサイズを想定しているためこれだとメモリが不足してしまいます。

補足情報(FW/ツールのバージョンなど)

コンパイラ: gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04)
OS: Windows 11
プロセッサ: AMD Ryzen 7 3700U with Radeon Vega Mobile Gfx 2.30 GHz

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

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

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

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

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

guest

回答2

0

メモリの 4 領域をお読みください。

global変数を多用すると他の関数からもアクセスできていまいますので、static変数を使うことをお勧めします。

C

1int main(void) 2{ 3 Equation eq; // ここでコアダンプが発生してしまう 4 solve(eq); 5 return 0; 6}

を、以下に変更します。

C

1int main(void) 2{ 3 static Equation eq; // ここでコアダンプが発生してしまう 4 solve(eq); 5 return 0; 6}

投稿2022/01/19 11:02

ppaul

総合スコア24666

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

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

PC_breakman

2022/01/19 13:01

ご回答ありがとうございます。確認したところ、static変数にするとどうしてもsolve関数の引数にeqを取らせる必要が出てきますが、その際はスタックに確保されるためにコアダンプが発生してしまいます。これは回避する方法があるのでしょうか。
ppaul

2022/01/19 14:53

void solve(Equation *peq) { というように定義し、 solve(&eq); と呼び出しましょう。
PC_breakman

2022/01/20 00:35

その方法がありましたね。ご回答ありがとうございました。
guest

0

ベストアンサー

ローカル変数というのは、一般的にスタック領域に取られます。
が、スタック領域というのはサイズに制限があり、数MByte程度しか確保されていません。

ということで、サイズの大きな変数の確保はグローバル変数としましょう

投稿2022/01/19 10:28

y_waiwai

総合スコア87774

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

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

PC_breakman

2022/01/19 10:52

とても分かりやすいです。ありがとうございます。これは構造体変数をグローバル定義しても改善できないのでしょうか。
y_waiwai

2022/01/19 13:05

関数に引数で渡すときは。ポインタで渡せばいいです まあ、ちょっと扱いに注意する必要がありますが
PC_breakman

2022/01/19 13:11

その手がありましたね。動くように改善してみます。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問