0

これは私が物事についての確認が必要なために書いた単純なコードです。

#include <stdio.h>
#include <string.h>

void pr(int a);

int main(void)
{
  int a;

  printf("starting...\n");
  h1:
  scanf("%d", &a);
  if (a == 20)
    return 0;
  pr(a);
  goto h1;
  printf("ending...\n");
  return 0;
}

void pr(int a)
{
  char buf[256];
  if (a == 1)
    strcpy(buf, "number 1 has been choosed");
  else
    strcpy(buf, "other number");
  printf("BUF: %s\n", buf);
}

私の質問は
、関数が呼び出されるたびprに、配列が自動的にクリアされるか、関数が終了する前bufに実行する方が安全ですか?memset

4

2 に答える 2

2

関数prが呼び出されるたびに、配列bufは自動的にクリアされます

いいえ、自動保存機能があるため、未定義のデータが含まれます。最も簡単な方法は次のとおりです。

char buf[256] = {0}; /* Zeroes entire array. */

または、buf文字列として使用しているので、より安価なものを使用できます。

char buf[256];
buf[0] = 0;

補足:コードの外観は、コードにstrcpy依存せずstrcpy、各ブランチにあるため、この初期化は必要ありません。

于 2012-08-27T12:04:30.243 に答える
1

いいえ、未クリアです、内容は不定です。

これを C 文字列 (ゼロ文字で終わる一連の文字) として使用している場合、最も簡単な方法は、最初の文字をゼロに設定することです。

char buf[256];
*buf = '\0';

buf変数は自動保存期間オブジェクトであり、標準の関連部分は次のC11, 6.2.4 Storage durations of objects, para 6とおりです。

可変長配列型を持たないこのようなオブジェクトの場合、その有効期間は、関連付けられているブロックへのエントリから、そのブロックの実行が何らかの形で終了するまで延長されます。(囲まれたブロックに入るか、関数を呼び出すと、現在のブロックの実行が中断されますが、終了しません。) ブロックに再帰的に入ると、オブジェクトの新しいインスタンスが毎回作成されます。オブジェクトの初期値は不定です。オブジェクトに初期化が指定されている場合は、ブロックの実行で宣言に到達するたびに実行されます。そうしないと、宣言に到達するたびに値が不確定になります。

于 2012-08-27T12:04:46.367 に答える