0

我正在将Qt Creator 4.5 与GCC 4.3 一起使用,我遇到了以下问题,我不确定Qt或 C++ 是否相关:我调用一个带有 achar *作为输入参数的函数。在该函数内部,我进行了动态分配,并将地址分配给char *. 问题是当函数返回时它不再指向这个地址。

bool FPSengine::putData (char CommandByte , int Index)
{
  char *msgByte;
  structSize=putDatagrams(CommandByte, Index, msgByte);
}

int FPSengine::putDatagrams (char CommandByte, int Index, char *msgByte)
{
  int theSize;

  switch ( CommandByte ) {

    case (CHANGE_CONFIGURATION): {
      theSize=sizeof(MsnConfigType);
      msgByte=new char[theSize];

      union MConfigUnion {
        char cByte[sizeof(MsnConfigType)];
        MsnConfigType m;
      };

      MConfigUnion * msnConfig=(MConfigUnion*)msgByte;

      ...Do some assignments. I verify and everything is OK.
    }
  }
  return theSize;
}

当我返回指针时,它包含的地址与分配的地址完全不同putDatagrams()。为什么?
...

好的,我理解我的错误(新手错误:()。当将指针作为输入参数发送给函数时,您发送数据的地址而不是指针的地址,因此您不能将指针指向其他地方......它实际上是像 Index 这样的本地副本。使用 char * 成功返回数据的唯一情况是在函数调用之前分配内存:

bool FPSengine::putData (char CommandByte , int Index)
{
  char *msgByte;
  msgByte=new char[sizeof(MsnConfigType)];
  structSize=putDatagrams(CommandByte, Index, msgByte);
}

int FPSengine::putDatagrams (char CommandByte, int Index, char *msgByte)
{
  int theSize;

  switch ( CommandByte ) {

    case (CHANGE_CONFIGURATION): {
      theSize=sizeof(MsnConfigType);

      union MConfigUnion {
        char cByte[sizeof(MsnConfigType)];
        MsnConfigType m;
      };

      MConfigUnion * msnConfig=(MConfigUnion*)msgByte;

      ...Do some assignments. I verify and everything is OK.
    }
  }
  return theSize;
}
4

2 回答 2

3

有两种方法。传值方式(C风格):

int FPSengine::putDatagrams (char CommandByte, int Index, char **msgByte)

注意第二*msgByte。然后在里面putDatagrams(),做:

*msgByte = new char[theSize]; 

实际上,在您当前拥有的该功能中的任何位置msgByte,使用*msgByte. 调用时putDatagrams(),请执行以下操作:

structSize=putDatagrams(CommandByte, Index, &msgByte);

第二种方式,因为你在 C++ 中,你可以使用传递引用。只需将签名更改putDatagrams()为:

int FPSengine::putDatagrams (char CommandByte, int Index, char * &msgByte)

你应该很好。在这种情况下,您不需要修改调用者或putDatagrams()例程中的任何内容。

于 2009-11-03T19:23:52.133 回答
2

嗯,是。默认情况下,C++ 中的所有内容都是按值传递的。调用putDatagrams(a, b, c)中的参数是按值发送的 - 您不会期望index在代码中分配 to 来更改b调用站点的值。您msgByte=new char[theSize];只是分配给局部变量msgByte,覆盖传入的值。

如果要更改传递的参数以使调用站点变量发生更改,则需要通过引用传递,或者(在这种情况下)传递“指向指针的指针”(并尊重第一个指针,分配给实际的指针)。

于 2009-11-03T19:22:39.990 回答