从函数返回指向全局数组的指针
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]获取的数组元素的地址),而是包含错误元素地址的当前指针变量,它是否会被弹出。
在这种情况下,请建议最好的方法。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
时,您不是从传感器复制值,而是获得一个指向它的指针。
- 添加到数组指针
- C++语法差异:二维和一维数组(指针算术)
- 数组指针表示法C++(移动数组时)
- 复制后删除原始数组指针将前 3 个字节设置为 0
- C++访问指向结构的指针中的类数组指针
- C++编译时使用 constexpr 字符数组指针分配静态数组?
- std::flush可以用于将对象指针转换为其封闭数组指针吗
- 创建<int>对整数数组指针的矢量引用 (C++)
- 将 2D 数组指针传递给 C++ 中的函数
- 创建指针是否超过非数组指针的末尾,而不是从 C++17 中的一元运算符和未定义的行为派生?
- 队列数组指针 (C++)
- C++数组指针上的删除操作
- 对于循环不循环和检测字符数组 [指针和字符数组]
- 如何初始化数组指针对象
- 如何正确传递 2D 数组指针作为参数
- 从数组指针中获取怪异的数字
- 初始化std :: unique_ptr作为原始数组指针的初始化
- 将结构数组指针从C#传递到C
- STD :: Sort将数组指针设置为NULL
- C++数组指针错误无法将“int*”转换为“int**”