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

您将 malloc-ed 内存分配给 *f 这是未定义的行为,因为 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 回答