从函数返回指向全局数组的指针

Returning pointer to global array from function

本文关键字:数组 指针 全局 函数 返回      更新时间:2023-10-16

我在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]获取的数组元素的地址),而是包含错误元素地址的当前指针变量,它是否会被弹出。

在这种情况下,请建议最好的方法。Thx。

您没有涵盖函数的所有可能返回情况,即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

您需要确保函数的每个执行路径上都有一个有效的返回语句。在您当前的实现中,如果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时,您不是从传感器复制值,而是获得一个指向它的指针。