2015-12-14 144 views
2

我在C/C++編程方面經驗不足,所以我要求解釋。我有全局數組聲明如下。 ASAK它位於進程內存環境中初始化全局內存的獨立內存部分。從函數返回指向全局數組的指針

Sensor sensorsArray[SENSORS_COUNT] = {dhtTempSensor, dhtHumSensor, dallasTempSensor, waterLevelSensor}; 

我需要找到此數組中的元素並返回它的指針(因爲我要改變它的值)。我寫了這樣的功能。

Sensor* getSensorById(uint32_t id) { 
    for (int i = 0; i < SENSORS_COUNT; i++) { 
    Sensor* current = &sensorsArray[i]; 
    if (current->sensorId == id) { 
     return current; 
    } 
    } 
} 

它將正常工作,我不知道current指針,它是在棧上分配的,因此它在功能範圍,將它從棧函數結束後POP操作?或者它會正常工作。

我的意思不是指針(使用& sensorsArray [i]獲取的數組元素的地址),而是包含erray元素地址的當前指針變量,是否會被調用。

請建議如何在這種情況下如何做的最佳方式。 Thx。

+4

我想你在做什麼是好的。我只是添加一個'返回nullptr;'在功能結束時,如果沒有找到傳感器ID – marom

+0

如果找不到ID? –

+0

爲什麼不使用['std :: find'](http://en.cppreference.com/w/cpp/algorithm/find)? – NathanOliver

回答

0

你的代碼沒問題(如評論所示)。你不必擔心指針變爲無效的原因是它指向的內存(即全局數組)在超出函數範圍之外保持有效。僅僅因爲你碰巧創建了一個指針(並且記住,指針實際上只是一個與內存中的某個地方相對應的數字)並不意味着它在別處使用時變得無效。

當你說Sensor *current = &sensorArray[i];,那麼如果sensorArray[i]存儲在,比如說,位置0x10在內存中,然後current = 0x10,不管在哪裏使用它,然後sensorArray[i]仍然會在內存位置0x10。當您爲current分配一個值時,您不是從傳感器複製數值,而只是獲取指向它的指針。

3

您未涵蓋該函數的所有可能的返回情況,即id與數組中的任何id s不匹配的情況。

如果沒有匹配,當前指針將返回數組的最後一個元素。

你可以更正通過定義指針Sensor* sensor_found = nullptrfor迴路,外,如果沒有傳感器發現的返回值仍然有效,即nullptr和分配的current找到價值sensor_found,只要有一個匹配。

Sensor* getSensorById(uint32_t id) { 

    Sensor* sensor_found = nullptr; 

    for (int i = 0; i < SENSORS_COUNT; i++) { 

     Sensor* current = &sensorsArray[i]; 

     if (current->sensorId == id) { 
      sensor_found = current; 
      break;  
     } 
    } 

    return sensor_found; 
} 

如果id發現回報current,否則,如果沒有匹配的回報nullptr

1

您要確保該函數在其每個執行路徑上都有一個有效的return語句。在你當前的實現中,如果id不匹配,那麼Sensor *的返回值沒有被設置並且將包含隨機字節。處理這種情況的一個方法是返回nullptr來指示傳感器未找到。除此之外,該功能將正常工作。

Sensor* getSensorById(uint32_t id) { 
    for (int i = 0; i < SENSORS_COUNT; i++) { 
    Sensor* current = &sensorsArray[i]; 
    if (current->sensorId == id) { 
     return current; 
    } 
    } 
    return nullptr; // id not matched 
}