重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

double x[100000];
int func(void) {
static double y[100000];
.....
return 0;
}
上記のようなC言語のプログラムで、大きな要素数の静的な配列x, yを、あえて初期化させずに定義する方法があれば教えてください。C言語の仕様では、明示的な初期化の指定がなければ値0に初期化されるので、例えば上記の場合には延々と0の代入による初期化が起こるのだと思います。
 アセンブラ言語であれば可能なので、”変数の定義のところだけ”アセンブラで書いてリンクするというのも可能かと思いますが、まずは(gccのオプションとかで)比較的簡単にできるのであればいいなと思います。

A 回答 (4件)

「C言語の仕様」としてそうである以上, 「C言語の仕様」としてはどうにも動かしようがありません. 既に指摘されているようにコンパイラや OS を含めた「処理系」全体の話になるので, 「gcc」としかわからない状況ではどうにもなりません (しさらに言えば処理系の詳細が分かってもどうにもならないかもしれない).



以下は余談.

C の仕様 (9899:1999 なら section 6.7.8, 9899:2011 は未確認だけどドラフトでは section 6.7.9) に

If an object that has static storage duration is not initialized explicitly, then:
(この質問に直接関係ないところは省略)
- if it has arithmetic type, it is initialized to (positive or unsigned) zero;
- if it is an aggregate, every member is initialized (recursively) according to these rules;
って書いてあるんだけどね>#3. ついでに指摘しておくと「プログラムの実行前に初期化される」というのも (別のところに) ある.
    • good
    • 0

> C言語の仕様では、明示的な初期化の指定がなければ値0に初期化されるので、


↑実際にそうなるのを確認しましたか?
C言語の仕様というよりはコンパイラの仕様で、初期化されない(明示的な初期化を伴わない)外部変数もしくはstatic変数はBSS(Block Storage Segment)へ割り付けられます。これは(コンパイラの仕様によりますが)初期化されません。コンパイラによっては、自動的もしくはオプションを指定することによってBSSを初期化するコードを生成するようにできます。
    • good
    • 0

何のためにしたいのですか?


ランダムな値で埋めたい? それなら横着せず実際に乱数で埋めましょう。
0埋めの演算時間を減らしたい? OSか初期化ルーチンの範疇なので実際の実装を確認して対処しましょう。

少なくとも静的変数なら0になるのが言語仕様なのだから、そうでない動作をさせるなら裏技になります。
どこでも通用する技じゃないんで使用する環境(コンパイラ、OS、CPU)と目的が不明だとトンチンカンな
回答になりそうです。
    • good
    • 0

> 上記の場合には延々と0の代入による初期化が起こるのだと思います。


> アセンブラ言語であれば可能

ということならば、アセンブリでの出力(GCCなら -Sオプション)を確認してはどうでしょうか?
実装に依存しますが、おそらく「必要な分の0の領域を用意」しているだけで、プログラムをロードした時点で0になっているのでは?
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!