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

时间:2015-12-14 19:56:51

标签: c++ c arrays pointers memory

我在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指针,它是否在堆栈上分配,因此它在函数范围内,是否会在函数结束后从堆栈中跳出来?或者它会正常工作。

我的意思是不是指针(使用&amp; sensorsArray [i]取得的数组元素的地址),但是包含erray元素地址的当前指针变量是否会被加速。

请在这种情况下建议最佳方法。 THX。

3 个答案:

答案 0 :(得分:3)

您没有涵盖函数的所有可能返回的情况,即id与数组的id中的任何Sensor* sensor_found = nullptr不匹配的情况。

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

您可以通过在for循环外定义指针nullptr来纠正这种情况,这样如果找不到传感器,则返回值仍然有效,即current并指定找到的值只有在匹配时才会sensor_foundSensor* 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,否则,如果没有匹配则返回linker command failed with exit code 1 (use -v to see invocation)

答案 1 :(得分:1)

您希望确保该函数在其每个执行路径上都有一个有效的return语句。在当前实现中,如果id不匹配,则不设置Sensor *的返回值,并且将包含随机字节。处理这种情况的一个问题是返回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
}

答案 2 :(得分:0)

您的代码很好(正如评论所示)。您不必担心code指针变为无效的原因是因为它指向的内存(即全局数组)在函数范围之外保持有效。只是因为你碰巧创建了一个指针(并且记住,指针实际上只是一个对应于内存中某个位置的数字)并不意味着它在其他地方使用时会变得无效。

当您说library(XML) doc <- xmlParse("C:/Path/To/XML/File.xml") # RETRIEVE FRAME ATTRS DATA FOR EACH OBJECT CHILD timestamp <- c() timecode <- c() numberofobjs <- length(xpathSApply(doc, "//Object")) for (i in (1:numberofobjs)) { timestamp <- c(timestamp, xpathSApply(doc, sprintf("//Object[%s]/ancestor::Frame", i), xmlGetAttr, "timestamp")) timecode <- c(timecode, xpathSApply(doc, sprintf("//Object[%s]/ancestor::Frame", i), xmlGetAttr, "timecode")) } # XPATH TO EACH ATTRIBUTE type <- xpathSApply(doc, "//Object", xmlGetAttr, "type") distance <- xpathSApply(doc, "//Object", xmlGetAttr,"DISTANCE") volume <- xpathSApply(doc, "//Object", xmlGetAttr, "VOLUME") id <- xpathSApply(doc, "//Object", xmlGetAttr, "id") id <- sapply(id, function(x) ifelse(is.null(x), NA, x)) # REMOVE NULLS code <- xpathSApply(doc, "//Object", xmlGetAttr, "code") code <- sapply(id, function(x) ifelse(is.null(x), NA, x)) # REMOVE NULLS # COMBINE LISTS INTO DATA FRAME xmldf <- data.frame(timecode = unlist(timecode), timestamp = unlist(timestamp), type = unlist(type), distance = unlist(distance), volume = unlist(volume), id = unlist(id), code = unlist(code)) 时,如果current存储在内存中,比如位置Sensor *current = &sensorArray[i];,那么sensorArray[i],无论在何处使用, 0x10仍将位于记忆位置current = 0x10。当您为sensorArray[i]分配值时,您没有从传感器复制值,而只是获取指向它的指针。