我想声明一个表,其中它的大小取决于另一个表:
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)
不能用于表达式中,无论是否为常量。