0

これは実行に問題があるようには見えませんが、戻ったときにbuff自動的に解放される可能性があると考えています。これ*stringにより、次回割り当て時に問題が発生し、そのメモリが上書きされます (またはさらに悪化するなど)。これまでのテストでは単に運が良かっただけかもしれないので、試行錯誤でテストしたくありません。私はこれを間違っていますか?

void strCat1000(char *concatDest, char *format, ...)
{
  char buff[1000];

  va_list arg_ptr;
  va_start(arg_ptr, format);

  vsnprintf(buff, sizeof(buff), format, arg_ptr);

  va_end(arg_ptr);

  free(concatDest);
  concatDest=buff;
}

より簡潔に言えば、この関数が戻った後、concatDest は解放されたメモリを指していますか?

4

4 に答える 4

0

あなたはそうあるべきです、

  • 長さパラメータを取る
  • concatDest を vsnprintf に渡す

..しかし、snprintfだけが残っています

buff はスタックに割り当てられ、concatDest をそのアドレスに割り当てることは機能しません。これは、スタックがポップされるとすぐに (戻ったとき)、それが指すメモリがなくなるためです。

より簡潔に: はい、メモリは解放されました。上書きされていない可能性があります(そのため、少しの間は機能するように見えるかもしれません)が、すぐに上書きされます.

于 2013-10-12T17:46:27.193 に答える