struct-C中字符串文字的sizeof

时间:2015-04-07 18:28:34

标签: c

我有以下代码:

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。

4 个答案:

答案 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)

只有两个选择:

  1. 存储终止字节。通常人们会使用null字符。当然,您必须确保在数组的有效数据部分中找不到终止字节。

  2. 在您的结构中添加一个长度成员。