2015-12-14 110 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 
}