1

How can I determine how many elements there are in an array of compound literals. I'm using the well known macro sizeof(a)/sizeof(a[0]); but keep getting 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 回答