void函数中的指针参数返回不一致的值

时间:2018-07-11 13:42:32

标签: c++ pointers

这可能是我忽略的愚蠢的简单事情,但是我正在Data::Data(char *DataType...)函数中设置值,因为它们正传递进来,而当我将它们悬停在它们上时,它们的设置就很好(变量{ {1}}应该悬停在上面。

但是,当下面调用type, material, ID, unit, reading函数时,当我将鼠标悬停在指针参数(getData)上时,它们被设置为随机字符串,例如目录名和文件名。我不确定为什么会发生这种情况,因为将变量设置在上面时,它们是正确的。

我已经包含了定义所有这些函数的Data类的头文件和实现文件,但是如果我需要在其中调用它们的地方,请告诉我,我没有这样做的唯一原因是因为通话时间很短,文件中充斥着其他不相关的内容。谢谢

*type, *materials.. etc

Data.hpp

Data.cpp
#include "Data.hpp"

Sensor::Sensor(char *DataType, char *Material, int ID, char *Sensor, double Min, double Max) {
  strcpy(type, Type);
  strcpy(material, Material);
  ID = SIDs;
  strcpy(unit, Units);
  max = Maxs;
  min = Mins;
}
Sensor::Sensor() {}


double Data::generateData() {
  reading = min + (rand() % (int)(max - min + 1));
  return reading;
}

void Data::getData(char *type, char *material, int *ID, char *unit, double *reading) {
  return;
}

Data::~Data(){}

2 个答案:

答案 0 :(得分:1)

您实施的Sensor::getData并没有您认为的那样。

让我们看一下这堂课:

class Foo
{
  void getX(int* x)
  {
  }

  int* x;
};

getX中,参数 x 隐藏同名的成员 x 。此函数实际上不执行任何操作:用户将指针传递到int,该指针在此函数中的名称为x。该成员不会自动复制到那里(这很令人惊讶,因为您可以将参数命名为其他任何名称)。如果要这样做,则必须明确地做到这一点:

void getX(int* x)
{
  *x = *this->x; // Pointed-to value is copied
  //x = this->x; // Pointer is copied
}

如果您未将function参数设置为任何值,则指针将始终指向内存中的随机垃圾,这是您在调试器中看到的。


表示“此参数将由此函数更改/设置”的更常见方式是传递引用:

class Foo
{
  void get(char*& x, int*& y, double& z)
  {
    x = this->x; // Now both parameter and member point to the same location.
    y = this->y; // Now both parameter and member point to the same location.
    z = this->z;
  }

  char x[32];
  int* y;
  double z;
};

或者,如果您不想复制指针,而是复制指向值

  void get(char* x, int* y, double& z)
  {
    strcopy(x, this->x);
    *y = *this->y;
    z = this->z;
  }

(PS:如果您的用例允许,我建议使用std::string而不是char数组。)

答案 1 :(得分:0)

无论是否调用getData(),未初始化的参数都会设置为随机垃圾。尝试将其打印出来,而不用调用getData()来查看。