Qt 指针赢了';不能返回指定的地址
我用4.5和4.3,我有以下问题,我不确定是C++相关的:我调用一个函数,使用<代码> char */COD>作为输入参数。在该函数中,我进行动态分配,并将地址分配给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
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没有引用,所以不能通过指针引用指针。