C++_配列 メモ 01

ポインタが知りたいが復習がてら。

宣言 → 初期化 → 既定値

 

ソースの変数は使いまわし。本来なら別変数。

宣言

 

    // OK
    int p[10];
   
    // OK
    const int num1 = 10;
    int p[num1]; // 定数式の必要あり。
   
    // NG
    int num = 10;
    int p[num2];
   
    // OK
    int num = 10;
    int* p = new int[num];
    delete[ ] p; // 不要になったならば、明示的に解放する。

サイズを可変としたいなら、std::vector を使用する。C# の List 的なもの。

 

初期化

 

    // OK
    int p[ ] = { 1, 2, 3 };
   
    // NG
    int p[2] = { 1, 2, 3 };
   
    // 指定の要素数に満たないと、残りの要素は既定値で初期化される。
    int p[3] = { 1 }; // 1, 0, 0
    int p[3] = {}; // 0, 0, 0
    int p[3]{}; // 0, 0, 0
   
    char ch[2] = {}; // '\0', '\0'
    int* ip[2] = {}; // 0x00000000, 0x00000000

 

既定値

既定値:明示的な初期化を怠った時既定で代入される値。

C# はメモリ領域の未初期化を認めていない
明示的な初期化を行わない場合、コンパイル エラーになるか、
既定値が入るかのどちらか。
基本既定値 0 埋め。 0 や false、null が代入される ( 全部メモリ上 0 で表現 )。

 

C++ では初期化していない領域に既定値が割り当てられる

    // 明示的に初期化
    int* x = new int[1];
    x[0] = 0xFFFFFFFF;
    printf("%08x\n", x[0]); // ffffffff 表示。
   
    // 値がどうなるか不定。Debug と Release ビルド時で挙動が異なる
    // 1 )
    int* px = x;
    delete x;
    printf("%08x\n", px[0]); // 削除済みの領域にアクセス
    // 2 )
    int* y = new int[1];
    printf("%08x\n", y[0]); // 未初期化

※ 常に同じ結果とは限らないらしい。

1 )
dddddddd 。Release だと ffffffff 。前の値が残っている。
dddd 略は削除済み領域を検知するためのパターン。

2 ) 既定値が割り当て。
インデックスが 0 は、cdcdcdcd 。値 (10 進) だと -842150451 。
インデックスが -1 の場合は 0xfdfdfdfd 。
double 型だとまた異なる。

 

 

こちらから。
https://so-zou.jp/software/tech/programming/cpp/grammar/pointer/array.htm
https://ufcpp.net/study/csharp/rm_default.html

以上。