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