【问题标题】:Returning pointer to global array from function从函数返回指向全局数组的指针
【发布时间】:2015-12-14 19:56:50
【问题描述】:

我在 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 元素地址的当前指针变量,它是否会被弹出。

请建议在这种情况下如何做的最佳方法。 谢谢。

【问题讨论】:

  • 我觉得你做的还可以。我只想添加一个'return nullptr;'在函数结束时,以防您找不到给定 ID 的传感器
  • 找不到id怎么办?
  • 为什么不使用std::find
  • return current 返回current,这样就可以了。不允许你做的事情是返回当前地址:return &amp;current 将不起作用。
  • @NathanOliver:您的建议是“先学习 C++,而不先学习 C”,对吧?我想知道 fwzfhxhoryfs 的意见...

标签: c++ c arrays pointers memory


【解决方案1】:

您没有涵盖函数的所有可能返回情况,即id 与数组的任何ids 都不匹配的情况。

目前如果没有匹配,指针将返回数组的最后一个元素。

您可以通过在for 循环之外定义指针Sensor* sensor_found = nullptr 来纠正此问题,这样如果没有找到传感器,则返回值仍然有效,即nullptr 并将找到的current 值分配给@ 987654327@,仅当匹配时。

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

【讨论】:

    【解决方案2】:

    您要确保函数在其每个执行路径上都有有效的返回语句。在您当前的实现中,如果 id 不匹配,则 Sensor* 的返回值未设置并且将包含随机字节。处理这种情况的一个 wau 是返回 nullptr 以指示未找到 Sensor。除此之外,该功能将正常工作。

    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
    }
    

    【讨论】:

      【解决方案3】:

      您的代码很好(正如 cmets 所建议的那样)。您不必担心current 指针变得无效的原因是它指向的内存(即全局数组)在函数范围之外仍然有效。仅仅因为您碰巧创建了一个指向该内存的指针(请记住,指针实际上只是一个对应于内存中某个位置的数字)并不意味着它在其他地方使用时变得无效。

      当你说Sensor *current = &amp;sensorArray[i];,那么如果sensorArray[i] 存储在内存中的位置0x10,那么current = 0x10,无论在哪里使用,那么sensorArray[i] 仍然会在内存中位置0x10。当您为current 分配一个值时,您并没有从传感器复制该值,您只是得到一个指向它的指针。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多