我正在使用Qt Creator 4.5和GCC 4.3我遇到以下问题,我不确定是Qt还是C ++相关:我用{调用一个函数{1}}作为输入参数。在该函数内部,我进行动态分配,并将地址分配给char *
。问题是当函数返回时它不再指向此地址。
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;
}
中指定的地址完全不同。为什么?
...
好吧我知道我的错误(菜鸟错误:()。当发送指针作为输入参数给函数时,你发送数据的地址而不是指针的地址,所以你不能让指针指向其他地方...它实际上是像Index这样的本地副本。使用char *成功返回数据的唯一情况是在函数调用之前分配内存:
putDatagrams()
答案 0 :(得分: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 ++,你可以使用pass-by-reference。只需将putDatagrams()
的签名更改为:
int FPSengine::putDatagrams (char CommandByte, int Index, char * &msgByte)
你应该做得好。在这种情况下,您不需要修改调用者或putDatagrams()
例程内的任何内容。
答案 1 :(得分:2)
嗯,是的。默认情况下,C ++中的所有内容都按值传递。呼叫putDatagrams(a, b, c)
中的参数按值发送 - 您不希望在代码中分配给index
来更改呼叫站点b
的值。您的msgByte=new char[theSize];
只是分配给本地变量msgByte
,覆盖传入的值。
如果要更改传递的参数以使调用站点变量发生更改,则需要通过引用传递,或者(在这种情况下)传递“指向指针”的指针(并且远离第一个指针) ,分配给实际指针)。