指针不会返回指定的地址

时间:2009-11-03 19:14:47

标签: qt new-operator dynamic-memory-allocation

我正在使用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()

2 个答案:

答案 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,覆盖传入的值。

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