我有以下代码:
struct stest
{
int x;
unsigned char data[];
} x =
{
1, {"\x10\x20\x30\x00\x10"}
};
int main()
{
printf( "x.data: %d\n", (int)x.data[0] );
return 0;
}
哪个工作正常。但是,我需要使用"数据"。
的大小如果我这样做:
printf( "sizeof x.data: %d\n", (int)sizeof(x.data) );
我收到错误:
将'sizeof'无效应用于不完整类型'char []'
有没有办法获得"数据的大小"在这种情况下,还是建议我可以使用另一种方法?
我使用的编译器是gcc 4.6.3。
答案 0 :(得分:2)
由于x.data是一个空终止的char数组,你可以使用strlen函数。
printf( "sizeof x.data: %u\n", strlen(x.data)+1 );
如果数组包含null,则此代码将无法正常工作。在这种情况下,您需要将数组的长度存储在struct的单独成员中。
答案 1 :(得分:2)
正如其他人所说,strlen会得到你想要的东西。
您遇到麻烦的原因不是字符串文字方面,而是the lack of a definite size of the array in your struct。这是一个不完整的类型。编译器不知道数组有多大,因此sizeof无法弄明白。
具体来说,这是一个“灵活的阵列成员”。 C99添加了这些。带有不完整数组的数组作为最后一个元素(因此它有增长空间)。
Sizeof获取数据类型的大小。
应用于数组时的Sizeof,获取整个数组的大小
当应用于具有灵活数组成员ignores the array的结构时的Sizeof。
应用于不完整类型时的Sizeof简单地失败。它放弃了试图弄清楚阵列有多大。
这么长的故事很短,在你的数组中打了一个数字。 (或传递该信息)
struct
{
int x;
int thesizeofmyarrayisfive = 5;
unsigned char data[5];
}
答案 2 :(得分:2)
在结构中添加尺寸字段。
#define DATA ("\x10\x20\x30\x00\x10")
struct stest
{
int x;
size_t size;
unsigned char data[];
} x =
{
1, sizeof DATA, { DATA }
};
答案 3 :(得分:1)
只有两个选择:
存储终止字节。通常人们会使用null字符。当然,您必须确保在数组的有效数据部分中找不到终止字节。
在您的结构中添加一个长度成员。