簡體   English   中英

從函數返回指向全局數組的指針

[英]Returning pointer to global array from function

我對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指針,它是在堆棧上分配的,所以它在函數范圍內,函數結束后是否會從堆棧中彈出? 否則它將正常工作。

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

請提出在這種情況下的最佳方法。 謝謝。

你是不是涵蓋所有功能的可能恢復的情況下,即情況下,當id不匹配任何的id陣列的秒。

當前,如果不匹配,則指針將返回數組的最后一個元素。

您可以通過在for循環外定義指針Sensor* sensor_found = nullptr來更正該錯誤,以便如果沒有找到傳感器,則返回值仍然有效,即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

您想確保該函數在每個執行路徑上都有一個有效的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
}

您的代碼很好(如注釋所示)。 您不必擔心current指針變為無效的原因是因為它所指向的內存(即全局數組)在函數范圍之外仍然有效。 僅僅因為您碰巧創建了一個指向該內存的指針(記住,指針實際上只是一個對應於內存中某個位置的數字),並不意味着該指針在其他地方使用時將變得無效。

當您說Sensor *current = &sensorArray[i]; ,然后,如果sensorArray[i]存儲在內存中的位置0x10處,那么current = 0x10 ,無論使用在哪里,那么sensorArray[i]仍將位於內存位置0x10 當您為current分配一個值時,您並沒有從傳感器復制該值,而只是獲得了指向它的指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM