0

Qt Creator4.5GCC4.3を使用していますが、 QtまたはC ++に関連するかどうかわからないという次の問題があり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;
}

ポインタを返すと、で割り当てられたものとは完全に異なるアドレスが含まれていますputDatagrams()。なんで?
..。

OK thx私は私の間違いを理解しています(ルーキーの間違い:()。関数への入力パラメーターとしてポインターを送信するときは、データのアドレスを送信しますが、ポインターのアドレスは送信しないため、ポインターを別の場所にポイントすることはできません...これは実際には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

2つの方法があります。値渡しの方法(Cスタイル):

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

*の2番目に注意してくださいmsgByte。次に、の内部でputDatagrams()、次のことを行います。

*msgByte = new char[theSize]; 

実際、現在持っている関数のどこでも、をmsgByte使用して*msgByteください。呼び出すときはputDatagrams()、次のようにします。

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

2つ目の方法は、C ++を使用しているため、参照渡しを使用できます。の署名をputDatagrams()次のように変更するだけです。

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

そして、あなたは良いはずです。putDatagrams()この場合、発信者やルーチン内の何かを変更する必要はありません。

于 2009-11-03T19:23:52.133 に答える
2

はい、そうです。C ++のすべては、デフォルトで値によって渡されます。呼び出しのパラメーターは値で送信されます。コードでにを割り当てて、呼び出しサイトでの値を変更putDatagrams(a, b, c)することは期待できません。渡された値を上書きして、ローカル変数に割り当てているだけです。indexbmsgByte=new char[theSize];msgByte

呼び出しサイト変数が変更されるように渡されたパラメータを変更する場合は、参照で渡すか、(この場合)「ポインタをポインタに」渡す(そして最初のポインタを無視して、に割り当てる)必要があります。実際のポインタ)。

于 2009-11-03T19:22:39.990 に答える