C数组初始化

时间:2010-05-06 14:32:04

标签: c arrays

为什么

static char *opcode_str[] = { "DATA"
                            , "DATA_REQUEST_ACK"
                            , "ACK_TIMER_EXPIRED"
                            , "ACK_UNEXPECTED_SEQ"
                            , "ACK_AS_REQUESTED"
                            } ;

工作,但

static char **opcode_str = { "DATA"
                           , "DATA_REQUEST_ACK"
                           , "ACK_TIMER_EXPIRED"
                           , "ACK_UNEXPECTED_SEQ"
                           , "ACK_AS_REQUESTED"
                           } ;
当opcode_str [0]打印时,

与SEGV失败?

我认为这是因为第二个列表没有为五元素指针数组分配内存,但我需要更全面的解释。

一切顺利,

克里斯。

1 个答案:

答案 0 :(得分:10)

这是对的。您实际上是在尝试将数组分配给指针。 GCC 4.4.1默认警告:

opcode_str.c:4: warning: initialization from incompatible pointer type
opcode_str.c:5: warning: excess elements in scalar initializer

它重复多余的元素警告4次,因为你实际上只有5个指针只有一个适合。您可以使用gcc -Werror强制所有警告都是错误。

你可以这样做:

static char **opcode_str = malloc(sizeof(char *) * 5);
opcode_str[0] = "DATA";
opcode_str[1] = "DATA_REQUEST_ACK";
opcode_str[2] = "ACK_TIMER_EXPIRED";
opcode_str[3] = "ACK_UNEXPECTED_SEQ";
opcode_str[4] = "ACK_AS_REQUESTED";

但是你已经找到了最好的方法。就错误发生时,一旦调用未定义的行为,您实际上不能指望特定的时间来显示问题。

但我认为opcode_str拥有一个指向DATA的指针。所以(假设是32位)它会尝试解释opcode_str('D','A','T','A')的前四个字节,就像char *的四个字节一样。