2013-09-28 40 views
0

當我提供一個結構時,我有一個函數,它給了我一個字節的字符緩衝區。如何在不全局存儲的情況下返回數組?

unsigned char complete[16] = { 0 }; 

char* construct_complete_array(socketType* m) 
{ 
    unsigned char *temp = (unsigned char*) m; 
    size_t j; 

    for (j = 0; j < sizeof(*m); j++) 
    { 
    complete[j] = *(temp); 
    printf("%.2x ", *(temp)); 
    *temp++; 
    } 

    return complete; 
} 

int diff_bit_calc(socketType* datanode, socketType* knode) 
{ 
    char* result = construct_complete_array(datanode); 
    size_t j; 

    printf("\nPrinting result: \n"); 

    for (j = 0; j < sizeof(*datanode); j++) 
    { 
    printf("%.2x ", *(result)); 
    *result++; 
    } 
} 

我希望它是一個通用函數,它提供了一個結構將返回結構的字符緩衝區。 我可能有另一次調用像

char* result1 = construct_complete_array(knode); 

(我不認爲有complete[16] buffer作爲全球一個好主意。有它的本地和返回它仍然是一個沃瑟的想法。)

回答

0

內聲明的靜態數組功能。

char* construct_complete_array(socketType* m){ 

    static unsigned char complete[16]= {0}; 
    unsigned char *temp = (unsigned char*)m; 
    size_t j; 
    for (j = 0;j<sizeof(*m);j++){ 
     complete[j] = *(temp); 
     printf("%.2x ", *(temp)); 
     *temp++; 
    } 
    return complete; 
} 
3

一般來說,如果不動態分配內存,您無法做到這一點。大多數人通過在調用函數中聲明緩衝區並將該緩衝區傳遞給函數來解決該問題,函數將填充傳遞的緩衝區。

在您的具體情況下,我不太確定函數是否必要;這是相當短的內聯做,比如:

/* to get the bytes representing `something' into a char array */ 
char something_chars[sizeof(something)]; 
memcpy(something_chars, &something, sizeof(something)); 
0

你不得不改變你的界面位:

char* construct_complete_array(socketType* m, char temp[]); 

然後在主叫方可以使用複合字面常量提供temp

char* result = construct_complete_array(datanode, (char[sizeof *datanode]){ 0 }); 

如果有重複,在幾個地方,你可以將它放入宏

#define CONSTRUCT_ARRAY(X) construct_complete_array((X), (char[sizeof *(X)]){ 0 }) 

所以再次呼叫側面看上去幾乎和你之前

char* result = CONSTRUCT_ARRAY(datanode); 

有它對於這個工作,你只需要心目中具有相同的續航時間在result指向本地數據的價值result本身。

1

據我所知,有兩種方法可以做到這一點。 由於函數的返回值是一個指針,所以你必須確保你存儲的內存結果不會被銷燬。除了使用全局變量,你可以使用動態分配內存(如icktoofay說的)或靜態關鍵字 (如Tay Wee Wen說的)。

  • 當使用動態分配存儲器,該功能的用戶應當功能外記得免費()。
  • 在塊內使用static關鍵字時,存在覆蓋的問題。如果您多次調用該函數,則只保留最後的返回值。

順便說一下,*temp++;有點奇怪,爲什麼不用temp++;來代替。

相關問題