2013-07-18 56 views
0

我有以下代碼寫入C:字符指針成char陣列

unsigned char * pan_protocol_get_image(unsigned long *psize) 
{ 
    long fsize; 
    unsigned char *result; 

    (void)pan_socket_write_ulong(MSG_GET_IMAGE); 
    pan_protocol_expect(MSG_IMAGE); 

    /* Read the size of the data in the message */ 
    (void)pan_read_long(&fsize); 
    if (psize) *psize = fsize; 

    /* 
    * Allocate a buffer large enough for the result. We add one 
    * in case the size is zero because we need a valid pointer. 
    */ 
    result = (unsigned char *)malloc(fsize + 1); 

    /* Read the data directly into the result buffer */ 
    (void)pan_read((void *)result, fsize); 
    return result; 
} 

據我明白,上述函數返回一個指向一個字符(而不是字符數組)。我對麼?

如果是這樣的話,我該如何將函數結果(即指向一個字符的指針)轉換爲一個字符數組,以便我可以逐一讀取它們?

+1

從技術上講,它是一個指向角色的指針。準確地說,它指向一個存儲字符的地方。然而,沒有什麼能夠阻止這個字符被其他字符所遵循 - 這是有道理的,因爲用'malloc'分配的內存塊看起來大於'1'。您可能可以通過該指針有效地到達一組字符。 – Nbr44

+0

上面的代碼實際上是指向一個字符流/數組而不是單個字符。所以你可以讀取字符數組返回的結果。 – Jack

+0

鑑於它做malloc(fsize + 1);,我想知道是否意圖添加尾隨\ 0 – doctorlove

回答

0

psize得到由功能設置,如果它不發一空,這裏

if (psize) *psize = fsize; 

所以,從外面你應該能夠做到這一點:

for (unsigned long i = 0; i<psize; ++i) { 
    //do something with result[i] } 
} 

不要忘了完成後請釋放result

+0

感謝大家對這個功能發生了什麼的很好的解釋。我以前從未使用過malloc,所以我不確定它做了什麼。再次感謝,它真的有幫助 – elrim

+0

@elrim考慮一個有用的答案勾號 - 去查找malloc和免費:-) – doctorlove

+0

我試圖投票的所有答案是有用的,但它告訴我,我需要更多的聲譽來做到這一點:(如此不公平 – elrim

1

你不需要改變你的返回類型。您可以使用索引直接解引用由malloc()分配的內存區域。您正在返回數組的基地址。因此,通過向該地址添加索引,您可以直接訪問您分配的內存。 可以訪問這樣的,

result[0],result[1],.... 
+0

謝謝!很高興知道有時事情會變得比我想象的要容易 – elrim

2

在C中,陣列僅僅是相同類型的元素的序列。字符串只是數組,只是一系列字符。

數組(和字符串)僅以一種方式表示 - 指向第一個元素(字符)的指針。正如你可能得出的結論,是的,只有通過指向第一個元素的指針才能知道數組或字符串的長度。由於這個原因,所有C字符串都附加了空字符'\0',它只是一個全零的字節,用於檢測字符串的結尾。對於數組,你必須通過這個長度(除了一些特殊的陷阱,我會在這裏跳過)。

在你的程序中,該malloc()函數分配fsize+1字節並返回一個指向第一個字節,然後由pan_protocol_get_image()

作爲一個C程序員回來,它成爲你的責任,以確保該指針從返回函數指向字符串的第一個字符,並且該字符串具有空終止符。

只需使用返回值作爲普通字符串,就沒事了。另外要小心,你不知道這個函數返回的緩衝區(字符串)的長度。