[英]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.