Qt 指针赢了';不能返回指定的地址

Qt 指针赢了';不能返回指定的地址,qt,new-operator,dynamic-memory-allocation,Qt,New Operator,Dynamic Memory Allocation,我用4.5和4.3,我有以下问题,我不确定是C++相关的:我调用一个函数,使用 char */COD>作为输入参数。在该函数中,我进行动态分配,并将地址分配给char*。问题是,当函数返回时,它不再指向此地址 bool FPSengine::putData (char CommandByte , int Index) { char *msgByte; structSize=putDatagrams(CommandByte, Index, msgByte); } int FPSengin

我用4.5和4.3,我有以下问题,我不确定是C++相关的:我调用一个函数,使用<代码> char */COD>作为输入参数。在该函数中,我进行动态分配,并将地址分配给
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()
中指定的地址完全不同。为什么?

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

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;
}

是的,C++中的所有东西默认是通过值传递的。调用<代码>参数PATDATAGAMS(A,B,C)< /C> >按值发送-您不会期望在代码中分配“<代码>索引>代码>,以更改调用站点中的<代码> B<代码>的值。;只是赋值给局部变量

msgByte
,覆盖传入的值


如果要更改已传递的参数,以使调用站点变量发生更改,则需要通过引用传递,或者(在本例中)传递“指向指针的指针”(并从第一个指针开始,分配给实际指针)默认情况下,C++中的所有内容都是按值传递的。调用<代码> > PATDATAGRAM(A、B、C)< /代码>中的参数是按值发送的。您不会期望在代码中分配“<代码>索引>代码>,以更改调用站点中的<代码> B<代码>的值。;只是赋值给局部变量
msgByte
,覆盖传入的值


如果要更改已传递的参数,以使调用站点变量发生更改,则需要通过引用传递,或者(在本例中)传递“指向指针的指针”(并从第一个指针转移到实际指针)。

有两种方法。通过值传递方式(C样式):

注意
msgByte
的第二个
*
。然后在
putDatagrams()的内部执行以下操作:

*msgByte = new char[theSize]; 
structSize=putDatagrams(CommandByte, Index, &msgByte);
事实上,在该函数中当前有
msgByte
的任何位置,使用
*msgByte
。调用
putDatagrams()
时,请执行以下操作:

*msgByte = new char[theSize]; 
structSize=putDatagrams(CommandByte, Index, &msgByte);

第二种方式,因为您在C++中,可以使用传递引用。只需将<代码> PATDATRAGAMSH()/<代码>的签名更改为:

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

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

有两种方法。传递值方式(C样式):

注意
msgByte
的第二个
*
。然后在
putDatagrams()的内部执行以下操作:

*msgByte = new char[theSize]; 
structSize=putDatagrams(CommandByte, Index, &msgByte);
事实上,在该函数中当前有
msgByte
的任何位置,使用
*msgByte
。调用
putDatagrams()
时,请执行以下操作:

*msgByte = new char[theSize]; 
structSize=putDatagrams(CommandByte, Index, &msgByte);

第二种方式,因为您在C++中,可以使用传递引用。只需将<代码> PATDATRAGAMSH()/<代码>的签名更改为:

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

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

这是在C++中还是C++中的唯一正确的。虽然C没有引用,但是不能通过引用指针传递到PoTeNess。这在C++还是C中都是正确的。C没有引用,所以不能通过指针引用指针。