4

次のコード:

#include<stdlib.h>
#include<stdio.h>

int main (void) {
    FILE** f;
    if ( (*f = (FILE *)malloc( sizeof(FILE *)) ) == NULL) {
        printf("Out of RAM or some other disaster!\n");
        return 1;
    }
    printf("OK!\n");
    return 0;
}

Mac OS X 10.8 上で問題なくコンパイルおよび実行されます。ただし、Windows 7 (MinGW でコンパイル) では、malloc() でクラッシュします。なぜこれが起こるのでしょうか、またはそれを止めるためのアイデアはありますか?

ありがとう!

注: これは明らかに元はより大きなプログラムの一部でしたが、プログラム全体を上記のように縮小し、Mac と PC の両方でこのコードだけを試し、動作を再現しました。

4

4 に答える 4

7

fはまだどこも指していないため、逆参照 ( *f) は無効であり、動作は未定義です。

于 2012-11-29T18:45:28.680 に答える
4

f は初期化されていないため、malloc されたメモリを *f に割り当てていますが、これは未定義の動作です。への変更

f = (FILE **)malloc( sizeof(FILE *))
于 2012-11-29T18:45:37.610 に答える
2

f最初に割り当てる必要があります

f = (FILE **)malloc( sizeof(FILE *))

そして、あなたはに割り当てることができます*f

*f = (FILE *)malloc( sizeof(FILE))
于 2012-11-29T18:47:47.457 に答える
1

動的割り当ての一般的なイディオムは次のとおりです。

T *p = malloc(sizeof *p * num_elements);

また

T *p;
...
p = malloc(sizeof *p * num_elements);

したがって、割り当てる適切な方法fは次のとおりです。

f = malloc(sizeof *f)

Cではキャストは不要であり、の結果をキャストすることmallocはお勧めしません。式のタイプ*fFILE *sizeof *fと同じですが、タイプが正しいことを確認する必要がないsizeof (FILE *)点が異なります。sizeof *f

于 2012-11-29T18:58:31.907 に答える