3

calloc に依存するコードを書いていますが、calloc が失敗した場合はポインタをスタック領域に再ポイントし、free() を呼び出す前にポインタを NULL に設定するか、完全にスキップしても安全ではないかと考えていました。私の 386 Linux ボックスでうまく動作します。

char *str = NULL;
int usestackspace = 0;
char str1[16] = {0};

str = (char *)calloc(1, sizeof(pid_t));

if (str == NULL) {
    sleep(1);
    str = (char *)calloc(1, sizeof(pid_t));
}

if (str == NULL) {
    fprintf(stderr, "watchdog: %s\n", strerror(errno));
    usestackspace = 1;
    str = str1;
}

if (str == NULL) {
    return -1;
}
4

1 に答える 1

2

str1範囲外に出ない限り、コードはほとんど問題ありません。実際のエラーが 1 つあります (実行時には問題にならない可能性がありますが、警告が生成されるはずです)。

  • str = &str1明示的なキャストなしでは有効な代入ではありません。あなたはおそらくしたいですstr = str1

1 つの潜在的な問題:

  • による暗黙的なメモリのゼロ設定に依存していた場合はcalloc、初期化する必要がありますstr1。たとえば、 を使用char str1[16] = { 0 }または呼び出します。memset

そしていくつかのマイナーなメモ:

  1. callocC プログラムでは、戻り値をキャストする必要はありません。

  2. free(str)ステートメントにとstr = NULLがありますifが、どちらもノーオペレーションです。ifステートメントの条件により、 がstr既にである NULLことが保証されます。

于 2013-07-19T22:24:30.643 に答える