2013-03-25 478 views
1

我通过这个阅读(How to initialize a unsigned char array?),但它不完全回答我的问题。如何初始化一个可变长度的unsigned char数组?

我知道可以创建字符串一个这样的数组:

const char *str[] = 
{ 
    "first", 
    "second", 
    "third", 
    "fourth" 
}; 

,如果我想要写()这些我可以使用:写(FD,STR [3],的sizeof(STR [3 ]));

但是如果我需要一个可变长度的无符号字符数组呢?我尝试这样做:

const unsigned char *cmd[] = 
{ 
    {0xfe, 0x58}, 
    {0xfe, 0x51}, 
    {0xfe, 0x7c, 0x01, 0x02, 0x00, 0x23}, 
    {0xfe, 0x3d, 0x02, 0x0f} 
}; 

,我得到的gcc编译警告,如 *“牙套周围标量初始化” *“初始化将指针从整数,未投”

+1

你不能做,没有你的子阵列引入的名字。并且顺便说一下,你的代码被编入了'write(fd,str [3],strlen(str [3]));'。 'strlen'不是'sizeof'。指针上的'sizeof'指向的是指针的大小,而不是它所指向的数据的大小。 – john 2013-03-25 15:41:01

+0

没有可变长度的数组。你的'str'是一个指针数组,而不是可变长度数组。用字符串文字初始化指针是可以的。没有数组文字,您不能使用支撑列表来初始化指针。 – 2013-03-25 15:49:19

+0

好吧,明白了。我理解并同意这里的评论。谢谢!! – 2013-03-25 15:57:55

回答

4

这是一种方式

const unsigned char cmd1[] = {0xfe, 0x58}; 
const unsigned char cmd2[] = {0xfe, 0x51}; 
const unsigned char cmd3[] = {0xfe, 0x7c, 0x01, 0x02, 0x00, 0x23}; 
const unsigned char cmd4[] = {0xfe, 0x3d, 0x02, 0x0f}; 

const unsigned char *cmd[] = 
{ 
    cmd1, 
    cmd2, 
    cmd3, 
    cmd4 
}; 
+0

你能解释为什么这个子数组需要命名吗? – dchhetri 2013-03-25 15:47:03

+0

n.m.在上面的评论中解释它。 – john 2013-03-25 16:01:21

0

使用多维数组时,必须指定最后一个维的大小,以便编译器计算正确的地址算术。 你的cmd指针数组有两个维度。所述第二维具有6种元素的最大长度,所以:

const unsigned char cmd[][6] = 
{ 
     {0xfe, 0x58}, 
     {0xfe, 0x51}, 
     {0xfe, 0x7c, 0x01, 0x02, 0x00, 0x23}, 
     {0xfe, 0x3d, 0x02, 0x0f} 
}; 

从ANSI C标准: “如果未知大小的阵列被初始化时,它的大小是由最大索引 元件具有显式确定初始化程序,在其初始化程序列表的末尾,数组不再有 具有不完整的类型。“

ANSI C draft Standard C11

0

这为我工作(与铿锵& GCC编译):

const unsigned char *cmd[] = 
{ 
    (unsigned char[]){0xfe, 0x58}, 
    (unsigned char[]){0xfe, 0x51}, 
    (unsigned char[]){0xfe, 0x7c, 0x01, 0x02, 0x00, 0x23}, 
    (unsigned char[]){0xfe, 0x3d, 0x02, 0x0f} 
}; 
+0

在VS2013中不适合我。谢谢。 – pilau 2015-02-02 05:11:51