2015-05-02 39 views
0

如果函數返回一個指向動態/未知大小的uint8_t數組的指針,那麼如何使用該指針填充我的本地數組?通過指針動態複製到uint8_t數組中

uint8_t * func(void){ 

uint8_t bs[] = {0x34, 0x89, 0xa5}; //size is variant 

return bs; 

} 

void main(void){ 

uint8_t * p; 

static uint8_t myArr[10]; //size is always greater than what's expected from p 

p = func(); 

} 

如何使用p填補myArr,該這可能在不同的調用是不同的大小?這是否可以確定陣列的大小,p指向?

請原諒我的編程經驗!謝謝。

+2

不,事實並非如此。在你的例子中,'func'返回一個指向本地數組的指針。只要func返回,該陣列就不復存在。所以'p'主要指向內存,你根本沒有權利使用。 – Mat

+0

返回'bs'in'func'導致UB,不要這樣做 – user3528438

+0

是的,這也是一個問題,[這裏是關於它的過去的問題](http://stackoverflow.com/questions/4570366/pointer- to-local-variable) – Diego

回答

0

你不能像你想要的那樣做。

需要知道數組大小需要與memcpy()一起復制,並且不能返回其範圍之外的任何自動變量。一旦離開函數,函數中的數組就不見了。您必須先用malloc()和朋友堆分配它,或將其設爲靜態。

#include <stdio.h> 
#include <stdlib.h> 
#include <inttypes.h> 
#include <string.h> 

uint8_t *func(size_t *size) { 

    uint8_t local_bs[] = {0x34, 0x89, 0xa5}; //size is variant 
    uint8_t *bs; 
    *size = sizeof(local_bs); 

    bs = malloc(sizeof(uint8_t) * (*size)); 
    if (bs == NULL) { 
     // allocation error return or exit here. 
    } 

    memcpy(bs, local_bs, sizeof(uint8_t) * (*size)); 

    return bs; 

} 

int main(){ 

    uint8_t *p; 
    size_t *size = malloc(sizeof(size_t)); 
    if (size == NULL) { 
     // allocation error return or exit here. 
    } 
    size_t i; 

    p = func(size); 

    // do stuff here with p 
    for (i = 0; i < *size; i++) { 
     printf("%"PRIx8"\n", p[i]); 
    } 

    // need to cleanup the manually allocated p 
    free(p); 

} 
+0

調用'func'時你缺少一個參數。 –

+0

是固定的。我沒有真正測試代碼,所以如果我有另一個像這樣的錯誤請糾正我。 –

+0

請在發佈之前對您的代碼進行一些最低限度的測試(以及一般的答案)。這就是在這裏正確回答問題的想法。 –

0

雖然大多數其他答案和評論已經解決了OP的示例代碼中未定義的行爲。我試圖回答「複製指針動態/未知大小的uint8_t陣列,以及如何可以在OP使用指針填補本地陣列」

  1. 你需要明確傳遞的大小/長度動態內存像這樣: uint8_t *func(size_t *size)由羅文G公司的答覆中指出

  2. 或者,你需要有一個哨兵值,以紀念在內存中數據的結束,類似於C使用字符串「\ 0」,以紀念字符串的結尾。在這種情況下,只要需要內存的大小/長度,就可以遍歷整個內存來計算大小。

{0x34, 0x89, 0xa5, 0x00}; // size depends on the position of 0x00 and ofcourse bound by memory allocated

+1

...或「標記」可能是一個* lead *值,類似於一個Pascal字符串,因此避免了長度掃描操作。或者,由於長度和數據緊密相關,因此可以通過嵌入動態指針和大小成員的值返回一個'struct'。有多種選擇。 – WhozCraig

+0

@WhozCraig是的,也是。再加上一個。 – askmish