1

多次元配列(インデックスの切り替えに注意)として、2x3のchar行列を列の主要な順序で格納しています(これは少し混乱することはわかっていますが、ご容赦ください)。char[3][2]ここで、このマトリックスを印刷します。ただし、何らかの理由で最後の列が印刷されません。何故ですか?

これが私のコードです:

#include <stdio.h>

#define ARRAY_SIZE(x) ((sizeof (x)) / (sizeof((x)[0])))

typedef char matrix[3][2];

void print_matrix(matrix a)
{
    for (size_t i = 0; i < ARRAY_SIZE(a[0]); i++) {
        printf("[");
        for (size_t j = 0; j < ARRAY_SIZE(a); j++) {
            printf(" %c", a[j][i]);
        }   
        printf(" ]\n");
    }
}

int main(int argc, char *argv[])
{
    matrix a = {{'a','b'},{'c','d'},{'e','f'}};
    printf("sizeof(a) = %zu\n", ARRAY_SIZE(a));
    printf("sizeof(a[0]) = %zu\n", ARRAY_SIZE(a[0]));
    print_matrix(a);
    return 0;
}

コンパイルして実行すると、次のようになります。

$ gcc -Wall -std=c99 foo.c; ./a.out
sizeof(a) = 3
sizeof(a[0]) = 2
[ a c ]
[ b d ]

期待される出力:

[ a c e ]
[ b d f ]
4

3 に答える 3

3

それはあなたの機能が効果的にあるからです:

void print_matrix(char a[3][2])

しかし、これは本当に:

void print_matrix(char (*a)[2])

したがって、マクロはsizeof(ポインタのサイズと2要素char配列のサイズを計算している)を使用して間違った結果を生成します。2つの値をパラメーターとして関数に渡し、それらをループで使用すると、機能するはずです。

于 2013-03-17T23:53:27.303 に答える
2

追加:

printf("ARRAY_SIZE(a) = %zu\n", ARRAY_SIZE(a));
printf("ARRAY_SIZE(a[0]) = %zu\n", ARRAY_SIZE(a[0]));

にするprint_matrixと、問題が発生します。

ARRAY_SIZE(a) = 2
ARRAY_SIZE(a[0]) = 2

あなたはCの奇妙なコーナーケースの1つに噛まれました。多次元配列は、見た目ほど完全にはサポートされていません。特に、それらを引数として関数に渡すと、期待するデータ型が完全に作成されないため、ARRAY_SIZEマクロは関数の引数で正しく機能しません。

内部で実際に起こっていることは奇妙であり、それを実際に説明するのに十分理解できるかどうかはわかりませんが、簡単なバージョンでは、関数パラメーターとしての配列がポインターに分解されます。したがって、関数パラメータchar a [3] [2]は、実際にはchar *a[2]と漠然と同等のものになります。

于 2013-03-17T23:54:24.477 に答える
0

パラメータとして送信された配列がポインタに変換され、ポインタのDECAYINGが行われるため、sizeof演算子は機能しません。したがって、関数内では、行列のサイズを知ることはできません。

于 2013-03-31T20:13:43.307 に答える