2014-12-05 82 views
0

我不知道如何解釋這個問題,所以我會舉一個我期望做的例子。C - 放棄指針參數

我有一個函數從FIFO中獲取下一個字節。

void fifoGet(uint8_t * byte) { 
    *byte = somefunction(); 
} 

我正在做一個函數來刷新FIFO

void fifoFlush(void) { 
    uint8_t i; 
    uint8_t discardByte; 

    for (i=0; i<fifoLength; i++) { 
     fifoGet(&discardByte); 
    } 

} 

什麼我不知道,因爲我不需要那麼discardByte,可我避開分配內存,只是傳遞void指針指向fifoGet()?

喜歡的東西

void fifoFlush(void) { 
    uint8_t i; 

    for (i=0; i<fifoLength; i++) { 
     fifoGet(&void); 
    } 

} 
+0

沒有你不能。在某些情況下,您會停止該程序。這是破壞性的。原來的方式是夠好的。 – HuStmpHrrr 2014-12-05 19:14:51

回答

2

沒有,空洞的方法會導致出現不確定的程序的行爲,你會被提領指向未知的記憶。

您使用discardByte可能是最好的做法。

+0

'discardByte'具有函數作用域,所以當函數'fifoFlush'結束時它被釋放 - 所以存儲問題是沒有意義的。 – 2014-12-05 19:12:15

+0

@ DavidC.Rankin它不是一個存儲問題,我只是希望解決創建/處理變量的開銷(無可否認)。 – user3817250 2014-12-05 19:16:16

+0

不是沒有重構fifoGet – Bathsheba 2014-12-05 19:17:24

1

它不會採取太多的結構變更爲:

uint8_t fifoGet() { 
    return somefunction(); 
} 

void fifoFlush(void) { 
    uint8_t i; 

    for (i=0; i<fifoLength; i++) { 
     fifoGet(); 
    } 

} 
+0

我同意,這將是如何處理我的具體例子,但在我的實際應用fifoGet()是在ROM中,不能被修改。我應該在問題中包括這一點。 – user3817250 2014-12-05 19:20:49

+0

從這個角度來看,爲什麼不讓'fifoGet'返回'value'或'NULL'來允許'fifoflush(){while(fifoGet()!= NULL); }(這是對HuStmpHrrr的迴應),你的ROM改變了一切。您可以將最後一個元素設置爲'sentinel元素'設置爲'NULL'並保留指向'fifo'的指針,該指針將清空可指向最後一個元素'NULL'。 – 2014-12-05 19:21:56

+0

@ DavidC.Rankin我不能同意這一點。什麼阻止'fifoGet'返回有效的'0'?將不同類型的值綁定到一個返回類型的函數並不酷。 – HuStmpHrrr 2014-12-05 19:35:05