1

const テーブルを宣言すると、sizeof を使用してテーブルのサイズを取得できます。ただし、シンボル名の使用を停止すると、機能しなくなります。次のプログラムでテーブル A の正しいサイズを 0 ではなく出力する方法はありますか?

#include <stdio.h>

struct mystruct {
    int a;
    short b;
};

const struct mystruct tableA[] ={
    { 
        .a = 1,
        .b = 2,
    },
    { 
        .a = 2,
        .b = 2,
    },
    { 
        .a = 3,
        .b = 2,
    },
};

const struct mystruct tableB[] ={
    { 
        .a = 1,
        .b = 2,
    },
    { 
        .a = 2,
        .b = 2,
    },
};


int main(int argc, char * argv[]) {
    int tbl_sz;
    const struct mystruct * table;

    table = tableA;
    tbl_sz = sizeof(table)/sizeof(struct mystruct);
    printf("size of table A : %d\n", tbl_sz);

    table = tableB;
    tbl_sz = sizeof(tableB)/sizeof(struct mystruct);
    printf("size of table B : %d\n", tbl_sz);

    return 0;
}

出力は次のとおりです。

size of table A : 0
size of table B : 2

これは sizeof の意図した動作です。しかし、シンボル名の代わりにテーブルへのポインタが与えられた場合、コンパイラが const テーブルのサイズを知る方法はありますか?

4

5 に答える 5

5

ポインタのサイズを求めています。これは常にポインタ サイズです (通常、32 ビット マシンでは 4 バイト、64 ビット マシンでは 8 バイト)。2 回目の試行では、配列のサイズを要求しているため、期待どおりの結果が得られます。

于 2010-03-26T14:42:37.237 に答える
2

シンボル名の代わりにテーブルへのポインタが与えられた場合、コンパイラが const テーブルのサイズを知る方法はありますか?

いいえ、sizeof()コンパイル時に評価されるため (VLA の場合を除きますが、VLA は定数テーブルではありません)、コンパイラは通常、ポインターがどのテーブルを指しているかを判断できません。確かに、示されているシナリオでは、C 言語のいくつかの仮想的なバリエーションで可能かもしれませんが、それは sizeof() が返すものの定義が異なることを意味し、それはあなたが望むかもしれないがそうでない答えを得られないよりも大きな問題になるでしょう.得る。

したがって、他の誰もがう​​まく指摘したように、ポインターのサイズを取得すると、ポインターのサイズが得られます。結果がその仮定と一致しているため、標準の 32 ビット マシンを想定すると、構造体は 8 バイト、ポインターは 4 バイトであるため、予想どおり、除算の結果はゼロになります。

于 2010-03-26T15:31:04.570 に答える
1

いいえ - あなたはsizeof()ポインタを求めています。しかし、実際に取得しようとしているのは配列内の要素の数であるため、その値を返すマクロを使用できますが、配列の代わりにポインターを渡すと、通常はエラーが発生します。

#define COUNT_OF(x) ((sizeof(x)/sizeof(0[x])) / ((size_t)(!(sizeof(x) % sizeof(0[x])))))

詳細については、この SO の回答を参照してください: Is there a standard function in C that would return the length of an array?

C の代わりに C++ を使用する場合のより安全な解決策については、テンプレートを使用して、ポインターで配列カウントを取得しようとすると常にエラーが生成されるようにするこの SO の回答を参照してください: Compile time sizeof_array without using a macro

于 2010-03-26T14:50:33.403 に答える
1

短い答えはノーです。ポインターしかない場合、そのポインターを介して指されているもののサイズを取得する (標準的な) 方法はありません。

于 2010-03-26T16:19:45.497 に答える
0

構文的には正しいですが、サンプルはより慣習的に次のように記述されています。

const struct mystruct tableA[] = {
    {1, 2},
    {2, 2},
    {3, 3}, 
};

これは冗長ではないため、読みやすくなっています。

于 2010-03-26T14:49:10.093 に答える