カテゴリー: C言語

  • Go言語とC言語における多次元配列の違い

    Go言語とC言語における多次元配列の違い

    プログラミングにおいて、多次元配列はデータを構造化して管理するための重要な概念です。しかし、言語によって挙動が異なるため、Go言語とC言語の違いを理解しておくことが重要です。この記事では、両者の多次元配列の挙動を比較し、その違いを整理します。


    Go言語の多次元配列

    宣言と初期化

    Go言語では、多次元配列は以下のように宣言します:

    var arr [2][3]int
    • 外側の配列(行数)が 2
    • 内側の配列(列数)が 3

    この配列の構造は以下のようになります:

    [0 0 0]  // arr[0]
    [0 0 0]  // arr[1]

    初期値

    Go言語では、すべての配列要素は**デフォルト値(ゼロ値)**で初期化されます。具体的には、int 型の場合、すべての要素が 0 になります。

    実行例

    package main
    
    import "fmt"
    
    func main() {
        var arr [2][3]int
        fmt.Println(arr)
    }

    出力結果

    [[0 0 0] [0 0 0]]
    • fmt.Println を使うことで配列全体を一括して出力できます。

    C言語の多次元配列

    宣言と初期化

    C言語での多次元配列の宣言は次のようになります:

    int arr[2][3];
    • 外側の配列(行数)が 2
    • 内側の配列(列数)が 3

    この配列の構造は以下のようになります:

    arr[0][0] arr[0][1] arr[0][2]
    arr[1][0] arr[1][1] arr[1][2]

    初期値

    C言語では、**自動変数(ローカル変数)として定義された配列は初期化されません。そのため、配列の要素には未定義の値(ゴミ値)**が入ります。

    実行例

    #include <stdio.h>
    
    int main() {
        int arr[2][3];
        for (int i = 0; i < 2; i++) {
            for (int j = 0; j < 3; j++) {
                printf("%d ", arr[i][j]);
            }
            printf("\n");
        }
        return 0;
    }

    出力結果(例)

    -1073741824 0 4196352
    4196352 0 0

    出力は環境や実行タイミングによって異なりますが、これが「未定義の値」であることを示しています。

    明示的な初期化

    C言語では、配列を明示的に初期化することができます:

    int arr[2][3] = {0}; // 全要素を0に初期化

    結果

    0 0 0
    0 0 0

    Go言語とC言語の違い

    以下は、Go言語とC言語の多次元配列における主要な違いを整理した表です:

    特徴Go言語C言語
    配列の初期値ゼロ値で初期化未定義の値(ゴミ値)
    配列全体の出力fmt.Println で一括出力可能ループを使用して出力が必要
    メモリ配置連続したメモリ配置同じ
    宣言時の利便性初期化が不要初期化が必要

    まとめ

    Go言語とC言語の多次元配列の最大の違いは、初期化の挙動と出力の簡便さにあります。

    • Go言語はゼロ値で初期化されるため、初期化の手間が不要で、fmt.Println による簡単なデバッグが可能です。
    • 一方、C言語では初期化が行われず、不定値が入るため、デバッグ時に注意が必要です。また、配列全体を出力するにはループ処理を記述する必要があります。

    これらの違いを理解することで、両言語での多次元配列の利用がより効果的になります。