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

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

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

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

887閲覧

マージソートを実行する際にSegmentation faultが出る

kappamaking

総合スコア2

C

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2022/12/08 12:55

編集2022/12/08 12:59

前提

大学の課題で、C言語でマージソートを実行する関数を作っています。
引数は整数のデータ配列a、配列の左右の端のデータl,rの3つを使うよう指定されており、main関数が記述された他のファイルと一緒にコンパイルして実行します。
Linuxサーバでコンパイルして実行したところ、Segmetation fault(コアダンプ)が出てしまいました(コンパイルではエラーは出ませんでした)。
ソートを行うデータ配列の要素数は100万です。

何度かプログラムの流れをトレースしてみましたが原因が分からず、どこでエラーが起きているのか教えていただけると助かります。

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

Segmentation fault (コアダンプ)

該当のソースコード

C言語

1void merge_sort( int a[], int l, int r ){ 2 int tmp[20000000]; 3 int m,i,j,k; 4 5 if(r>l){ 6 m=(l+r)/2; 7 merge_sort(a,l,m); 8 merge_sort(a,m+1,r); 9 10 //tmp配列に前半のデータをコピー 11 for(i=l;i<m+1;i++){ 12 tmp[i]=a[i]; 13 } 14 i++; 15 //tmp配列に後半のデータを逆向きにコピー 16 for(j=r;j<m;j--){ 17 tmp[i]=a[j]; 18 i++; 19 } 20 i=l; 21 j=r; 22 23 //2つの配列の小さい要素を配列aにコピーする処理を繰り返す 24 for(k=l;k<r+1;k++){ 25 if(tmp[j]<tmp[i]){ 26 a[k]=tmp[j]; 27 j--; 28 }else{ 29 a[k]=tmp[i]; 30 i++; 31 } 32 } 33 } 34}

試したこと

データを一時的に保存するtmp配列の要素数を増やしましたが改善しませんでした。

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

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

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

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

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

guest

回答1

0

ベストアンサー

c

1int tmp[20000000];

こちらの配列に必要なメモリは、intが4バイトとすると約80MBになります。
Linuxだとスタックサイズ8MBあたりが標準らしいので、ローカル変数として上記配列を確保しようとすると、スタックが溢れて Segmentation fault となります。

投稿2022/12/08 13:51

actorbug

総合スコア2224

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

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

kappamaking

2022/12/08 14:07

tmpをグローバル変数にしたところ無事実行できました。(実はソートアルゴリズム自体も少し変だったので修正しました。) Linuxの仕様まで知っていないと修正できないエラーに、ソートアルゴリズムを作る程度の課題で遭遇することになるとは思いませんでした... 回答ありがとうございます。
dameo

2022/12/08 15:02

Linuxかどうかには関係なくC言語はスタックサイズが溢れてもチェックできません。ローカルに大きな変数を作っちゃうのは誰でも最初はやるけど、そのうちやらなくなりますよ。 なおLinuxはローカル変数用のスタック確保の際に4KBずつ先頭アドレスを触って物理メモリを確保するなど涙ぐましい努力をしてるように見えました。 Dump of assembler code for function merge_sort: 0x0000555555555189 <+0>: endbr64 0x000055555555518d <+4>: push %rbp 0x000055555555518e <+5>: mov %rsp,%rbp 0x0000555555555191 <+8>: lea -0x4c4b000(%rsp),%r11 0x0000555555555199 <+16>: sub $0x1000,%rsp => 0x00005555555551a0 <+23>: orq $0x0,(%rsp) 0x00005555555551a5 <+28>: cmp %r11,%rsp 0x00005555555551a8 <+31>: jne 0x555555555199 <merge_sort+16> 0x00005555555551aa <+33>: sub $0x430,%rsp ※矢印(=>)が落ちてるところ
dameo

2022/12/08 15:03

おっと質問者のコメントが消えてましたね。質問者のコメントに答えたはずだったけどw
dameo

2022/12/08 15:04

自分のコメントも消えた~~~。バグかなぁ
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問