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

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

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

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

Q&A

解決済

2回答

1291閲覧

C++ 静的配列を初期値0で初期化したつもりが初期化されていない

mjk

総合スコア303

C++

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

0グッド

1クリップ

投稿2020/08/08 09:48

実現したいこと

クラス初期化時に引数で指定したサイズの静的配列を0で初期化したい。

とある練習問題に取り組む中で今後のために試行錯誤していたら躓いたのでアドバイスください。
よろしくお願いします。

前提

静的配列を使わなければならない。(とある練習問題の制限

練習問題の制限ではないですが今後のために出来ることなら静的配列のサイズを指定出来るようにしたい。
vectorなどを使えば可能なことは理解しているつもりです。

発生している問題

0で初期化したつもりが初期化されずに不特定の数値のままになっている。

試したこと

質問用に必要と思われる部分だけ抜粋して下記コードを作ってみました。
比較用に問題となっている出力と期待する出力の2パターンを作ってみました。

コード

C++

1#include <bits/stdc++.h> 2 3class Test { 4public: 5 std::size_t MAX; 6 long long int array[]; 7 8public: 9 Test(std::size_t n) { initialize(n); } 10 11public: 12 void initialize(std::size_t n) { 13 MAX = n; 14 array[MAX] = {};//←ここで0で初期化してるつもりがされていない? 15 } 16}; 17 18int main() { 19 20 std::size_t array_size = 10; 21 22 // class Testで作った配列(0で初期化されていない出力となる) 23 Test test(array_size); 24 for (int i = 0; i < array_size; i++) { 25 std::cout << test.array[i] << " "; 26 } 27 std::cout << std::endl; 28 29 //直接作った配列(0で初期化された期待通りの出力となる) 30 long long int sample_array[array_size] = {}; 31 for (int i = 0; i < array_size; i++) { 32 std::cout << sample_array[i] << " "; 33 } 34 std::cout << std::endl; 35 36 getchar(); 37 return 0; 38} 39 40// 出力例 41// 15536856 140713998658294 0 0 4199840 24 0 0 16 4199721 42// 0 0 0 0 0 0 0 0 0 0

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

Win10
VSC1.47.3
C++14
gcc version 8.2.0 (Rev3, Built by MSYS2 project)

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

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

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

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

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

raccy

2020/08/08 09:59

そもそもC++ではVLAは使えません(gccで-pedantic-errorsを付けるとコンパイルエラー)。Cでは使えるため、コンパイラによってはC++でも可能ですが、その場合の動作はコンパイラの拡張仕様に関するドキュメントを読まないと、なんとも言えないです。
cateye

2020/08/08 10:04

一読をお勧めします→https://www.it-swarm.dev/ja/c%2B%2B/c-%E3%81%AE%E9%9D%99%E7%9A%84%E9%85%8D%E5%88%97%E3%81%A8%E5%8B%95%E7%9A%84%E9%85%8D%E5%88%97/969944921/
mjk

2020/08/08 10:53

raccyさん、cateyeさん、ありがとうございます。 VLAという単語を知らなかったので調べたら可変長配列とのことで使えないということを知れて助かりました。 リンク先の内容は難解ですが目を通しておきたいと思います。
guest

回答2

0

array[MAX] = {};//←ここで0で初期化してるつもりがされていない?

初期化、というのは宣言時にしか行なえません。
これ、コンパイルエラーになるんでは

投稿2020/08/08 10:31

y_waiwai

総合スコア88042

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

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

SHOMI

2020/08/08 10:46

g++ではコンパイル通りますね
mjk

2020/08/08 10:54

そうなんですよね。エラーにならずに結果がおかしいので何が間違っているのか中々気付きませんでした。
guest

0

ベストアンサー

C++

1long long int array[];

要素数が0です。
後から

C++

1array[MAX] = {};

としても確保されません。
その為以下は範囲外アクセスとなります。

C++

1 for (int i = 0; i < array_size; i++) { 2 std::cout << test.array[i] << " "; 3 }

vectornewも使わないならtemplateですかね。

C++

1#include <iostream> 2template<size_t size> 3class Test { 4public: 5 enum {MAX = size}; 6 long long int array[MAX];//sizeでもいいが後から要素数を使うかもしれないので一旦MAXに入れておく 7 8 Test():array{} { } 9}; 10 11int main() { 12 const size_t array_size = 10; 13 Test<array_size> test; 14 for (size_t i = 0; i < test.MAX; i++) { 15 std::cout << test.array[i] << " "; 16 } 17 std::cout << std::endl; 18}

投稿2020/08/08 09:59

編集2020/08/08 11:01
SHOMI

総合スコア4079

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

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

mjk

2020/08/08 10:56

回答ありがとうございます。 理解するために試行錯誤してみます。
mjk

2020/08/08 11:31

(裏技的?)templateを使う方法で期待通りの出力を得ることが出来ました。 ただ修正依頼のほうでご指摘あるように本来は出来ない仕様だと理解しました。 制限無ければやはりvector1択だなという感想ですが遠回りしたものの勉強なりました。 ありがとうございました。
SHOMI

2020/08/08 11:46 編集

念の為言っておくとtemplateでやっているのはVLAではありませんよ。 array_sizeが定数ではない場合はコンパイル時にサイズを決定できないためエラーとなります。
mjk

2020/08/08 11:55

すみません理解が足りていませんでした。 結論は何かしらの定数で指定するしかないということですね。 どちらにしても知らないことばかりだったので勉強になりました。 ありがとうございました。
SHOMI

2020/08/08 12:00 編集

templateで書く方法はサイズ毎に別のクラスを書かなくてもTest<2>やTest<3> などとすることで簡単に作れる利点があります。 あまり利用する機会はないかもしれませんが
mjk

2020/08/08 12:05

>>あまり利用する機会はないかもしれませんが そうなんですよね。 自分で質問しておいてあれなんですがvector使えば全て解決してしまいます。 ただ今後のためにもあれこれ遠回りするのもいいのかなと。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問