0

lccコンパイラを使用して呼び出すとtmpnam(buf)、プログラムがクラッシュします。

Reason: L_tmpnam indicates that buf must be 14 bytes long, while the string returned 
is "D:\Documents and settings\Paul\Temporary\TmP9.tmp" which is much longer than 14.  

何が間違っているのですか、この動作はどのように説明できますか。

4

1 に答える 1

0

からの逐語man tmpnam:

この機能は絶対に使用しないでください。代わりに mkstemp(3) または tmpfile(3) を使用してください。


とにかく、あなたがそれを求めたように:

によって生成される名前は、 name のディレクトリをに付けたtmpnam()最大長のファイル名で構成されます。L_tmpnamP_tmpdir

そのため、渡された to のバッファtmpnam()は宣言するのが最適です (C99 の場合):

char pathname[strlen(P_tmpdir) + 1 + L_tmpnam + 1] = ""; /* +1 for dir delimiting `/` and +1 for zero-termination */

C99 以外の場合は、次のようにします。

size_t sizeTmpName = strlen(P_tmpdir) + 1 + L_tmpnam + 1;
char * pathname = calloc(sizeTmpName, sizeof (*pathname));
if (NULL == pathname)
  perror("calloc() for 'pathname'");

次に、tmpnam()次のように呼び出します。

if (NULL == tmpnam(pathname))
  fprintf(stderr, "tmpnam(): a unique name cannot be generated.\n");
else
  printf("unique name: %s\n", pathname);

... /* do soemthing */

/* if on non C99 and calloc(() was called: */
free(pathname);
于 2013-04-07T09:33:00.727 に答える