使用C中的sizeof定义表格长度



我想声明一个表,其中它的大小取决于另一个表:

unsigned char Tab1[] = { 10u, 11u, 12u, 15u };
unsigned char Tab2[sizeof(Tab1) / sizeof(Tab1[0])];

有没有任何方法可以在不使用动态分配的情况下声明它?

发布的定义中不涉及动态分配:

unsigned char Tab1[] = { 10u, 11u, 12u, 15u };
unsigned char Tab2[sizeof(Tab1) / sizeof(Tab1[0])];

Tab1的大小不是动态的,它是在编译时由初始值设定项确定的。有4个值,因此Tab1的大小为4个元素。该定义相当于

unsigned char Tab1[4] = { 10u, 11u, 12u, 15u };

Tab2的定义很好,它将具有与Tab1相同数量的元素。但是请注意,Tab2没有初始化器,因此如果此定义发生在函数体内部,则它将被取消初始化。在设置之前访问其内容具有未定义的行为。

您在一条评论中提到,编译器抱怨编译时长度不固定这非常令人惊讶:要么发布的代码与您编译的代码不同,要么您的环境不一致。sizeof(Tab1) / sizeof(Tab1[0])是一个常量表达式,只要编译器解析Tab1时知道它的大小,它就可以用作数组定义的大小

如果Tab1的定义位于不同的源文件中,或者位于Tab2的定义之后,并且只看到了Tab1的声明,例如

extern unsigned char Tab1[];

那么Tab1的大小确实是未知的,并且sizeof(Tab1)不能用于表达式中,无论是否为常量。

相关内容

最新更新