为什么
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失败?
我认为这是因为第二个列表没有为五元素指针数组分配内存,但我需要更全面的解释。
一切顺利,
克里斯。
答案 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 *的四个字节一样。