簡體   English   中英

C數組初始化

[英]C array initialisation

為什么

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]被printf'd時,SEGV失敗了嗎?

我認為這是因為第二個列表沒有為五元素指針數組分配內存,但我需要更全面的解釋。

祝一切順利,

克里斯。

那是對的。 您實際上是在嘗試將數組分配給指針。 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 *的四個字節一樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM