c - 如何确定 C 中复合文字数组中有多少个元素?

标签 c compound-literals

如何确定复合文字数组中有多少个元素。我正在使用众所周知的宏 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;
}

最佳答案

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

关于c - 如何确定 C 中复合文字数组中有多少个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17279341/

相关文章:

c++ - 此 OpenMP 代码使 linux 崩溃

c - 在函数调用的参数内部定义新函数、数组、结构等

c - 这是使用 C 通过 UDP 发送二进制数据的正确方法吗?

c - AVR GCC,使用 Timer0 生成音调不起作用

c - C 中 % 运算符的问题

c - 如何获取命令sort的排序矩阵?

C 结构数组元素初始化转换

c - 字符串文字与 const char[] 或 char[] 之间的区别

c - 为什么 C 中的复合文字是可修改的