1

複合リテラルの配列に含まれる要素の数を確認するにはどうすればよいですか。私はよく知られているマクロを使用していますsizeof(a)/sizeof(a[0]);が、1.

#include <stdio.h>
typedef struct {
    int enable;
    const char * const *message;
} table_s;

static const table_s table[] =
{
    { 1, (const char * const []){ "Message 1", "Message 2"   } },
    { 1, (const char * const []){ "Message 1", "Message 2", "Message 3"} }
};

#define NELEMS(x)  (sizeof(x) / sizeof(x[0]))
int main(int argc, char *argv[]) {
    printf("%d\n", NELEMS(table[0].message));
    printf("%d\n", NELEMS(table[1].message));
    return 0;
}
4

3 に答える 3

1

sizeof(a)/sizeof(*a)aがコンパイル時の動的サイズ ブロックであり、そのように型指定されている場合にのみ機能します。

char * messages[] = { "Message 1", "Message 2", "Message 3"};

sizeof(messages)/sizeof(*messages) = sizeof((char *)[3]) / sizeof(char*) = 3

しかし、あなたの場合、ポインター型で操作しています

  NELEMS(table[0].message) 
= sizeof(table[0].message) / sizeof(table[0].message[0]) 
= sizeof(const char * const *)/sizeof(const char * const) 
= sizeof(void *) / sizeof(void *) = 1
于 2013-06-24T15:53:54.823 に答える
0

C配列が機能する方法のC原因でそれを行うことはできません。

int a[100]; があるとしましょう。

a は、要素が次々に配置されるメモリ領域への単なるポインタです。

この例では、int のバイトのサイズは 4 です。int へのポインター (int*) のサイズも 4 バイトです。

a は、0x0000866A のようなメモリ ドレスのみを格納する変数です。

そして、そのアドレスから始まる mem には、次のものがあります。

a[0]_on_first_4_bytes|a[1]_next_4_bytes|a[2]_next_4_bytes が互いに連結されています。

しかし、 (int*) のサイズ = (int) のサイズ => a のサイズ = a[0] のサイズなので。

要素の数をどこかに保存しない限り、他の方法では見つけることができません。

于 2013-06-24T15:53:47.487 に答える
0

「よく知られているマクロ」は配列でのみ機能し、ポインターでは機能しません。

あなたがしていることは、ポインターのサイズをポインターに取り、それをポインターのサイズで割ることです。あらゆる型のデータへのポインタは、ほぼ常に同じサイズです。これが、結果として 1 を取得する理由です。

于 2013-06-24T15:53:56.600 に答える