2014-01-05 23 views
0

我看到了這樣的一個示例代碼的一部分:用C中的大括號定義一個指針?

1 void func (uint8_t *buffer, uint16_t length) 
2 { 
3 uint8_t *pack = {0}; 
4 
5 for(int i=0; i<length; i++) 
6 { 
7  pack[i] = buffer[i]; 
8 } 
9  
10 // send out the "pack" here 
11 } 

這是爲了填補在「緩衝區」,以「包」的數據,然後發送「包」出到串行功能連接。

第3行是做什麼的?這就像定義一個所有元素都爲0的結構,但它是一個指針!這個指針指向哪裏?在for循環下,爲什麼它可以改變一個數組(包[1]),爲什麼我們並不需要聲明的大小,如:

uint8_t pack_array[length], *pack; 
*pack = pack_array; 

編譯器GCC是。

[編輯]:for循環中存在拼寫錯誤。

+6

這是什麼'for(int i = 0; i ++; i herohuyongtao

+0

從哪裏得到這個片段? – haccks

+2

這段代碼在for循環中有明顯的語義錯誤,如果沒有,它會調用'length!= 0'的未定義行爲。 – Nabla

回答

3

從C99標準,6.7.8p11:

爲標量的初始化應是一個單一的表達,任選在大括號。

術語「標量」是指算術類型和指針。

所以支架是允許的,什麼都不做。

uint8_t *pack = {0};將初始化指針pack與值0,所以它將是一個空指針。

以下for循環錯誤。兩者都是因爲它中的表達式順序不正確,並且因爲賦值取消引用pack這是一個空指針。

+0

表達順序的錯誤是我的錯。但其他行等於示例代碼。非常感謝您幫助我確認此代碼是錯誤的。 – eepty

0

在您的代碼片段中,內存未分配給pack。沒有分配內存,你不能使用下標數組。

for(int i=0; i++; i<length) 

是錯誤的。 i<length應爲for循環的第二個表達式。