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

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

新規登録して質問してみよう
ただいま回答率
85.31%
g++

g++はGNUコンパイラコレクション(gcc)のC++コンパイラーです。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

555閲覧

uint64_t静的配列が2^20以上確保できない

iFQ7Vj

総合スコア52

g++

g++はGNUコンパイラコレクション(gcc)のC++コンパイラーです。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2023/02/14 08:49

実現したいこと

要素数2^20以上の静的配列を確保する

前提

n個の素数を小さい方から探索し、配列に格納するコードを書いています。
セグフォが出たのですが配列への不正アクセスは見つからりませんでした。
配列サイズが大きすぎることが原因なのでしょうか

該当のソースコード

この後に処理があるのですが、明らかにここに問題があると思われますので、抜粋して載せます。

C++

1#include <cstdint> 2 3int main() { 4 5 const uint64_t n = 1 << 20; 6 uint64_t p[n] = {2}; 7 8 return 0; 9} 10

試したこと

要素数10^6までは確保が可能でした。
また、動的配列では2^20以上確保が可能でした。

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

g++ 10.2.1 (Debian 10.2.1-6)

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

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

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

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

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

melian

2023/02/14 09:07

> 要素数10^6までは確保が可能でした。 スタックの容量がそのくらい、ということなのでしょう。
iFQ7Vj

2023/02/14 09:17

ありがとうございます、解決しました
melian

2023/02/14 09:28

ちなみにですが、static を付けるとヒープに確保されます。(動的確保と同じ) static uint64_t p[n] = {2};
matukeso

2023/02/14 10:20

staticつけたら.dataか.bssであって、heapではないです
iFQ7Vj

2023/02/14 13:34 編集

なるほど、staticで確保するとheep, stack以外のメモリ領域を使えるということですか
melian

2023/02/14 13:33

> matukeso さん ご指摘ありがとうございます。 > iFQ7Vj さん すみません、間違った事を伝えてしまいました。
iFQ7Vj

2023/02/14 13:45 編集

staticを使うと他のメモリ領域も有効に使えそう、ということが知れて嬉しい限りです お二人ともありがとうございました
guest

回答1

0

ベストアンサー

スタックサイズが不足しているために発生していると思います。
g++ほとんど使ったことないですがg++でスタックサイズの変更などを参考にサイズを増やしてみてください。

投稿2023/02/14 09:07

can110

総合スコア38352

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

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

iFQ7Vj

2023/02/14 09:17

なるほど、スタックオーバーフローでもセグフォが出るんですね ありがとうございました
SaitoAtsushi

2023/02/14 09:33

linux を使ってないのであまり詳しくはないと先にお断りしておきますが、私の知識の範囲ではコンパイル時オプションの指定は Linux では効果がないんじゃなかったかと思います。 Linux ではスタックの上限は OS 側の設定に従う設計思想だったはずです。
iFQ7Vj

2023/02/14 13:45 編集

root以外のユーザーが利用出来るスタックには上限がありましたね。 static領域とstack領域を上手く使い分けることが、メモリを管理する上で重要ですね 丁寧に回答、コメントして頂き本当にありがとうございました
can110

2023/02/15 01:53

SaitoAtsushiさん、コメントありがとうございます。 linux上で~効果がない、という点についての参考情報(URL)などありましたら教えてください。 私もlinuxは詳しくないのでこちらで軽く調べたのですが、そのような情報が探しきれなかったので。
can110

2023/02/16 04:33

matukesoさん、情報ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問