配列サイズによるスタックオーバーフロー

エラーの内容

Cにおいて、double型の配列を1024*1024で確保した際、下記のエラーが出力された。

Segmentation fault: 11

原因

スタックに格納できる情報量を超えた配列を格納しようとしているため、スタックオーバーフローが起きている。

PCのスタックサイズの調べ方(Mac)

下記コマンドで調べられる。

$ ulimit -a


出力結果

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 256
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1418
virtual memory          (kbytes, -v) unlimited

8Mほどのスタックサイズに8Mの配列を格納しようとしていたことが原因だったみたい。。

解決方法

下記コマンドでスタックサイズを変更することができる。

$ ulimit -s 65532    // スタックサイズを65MBに変更

※この変更は一時的な変更

備考

今回はソースコードを変えたくなかったため、この方法で。
できれば、mallocを用いヒープ領域として動的に確保したほうがよい。