malloc()在Windows上崩溃但在Mac上崩溃

时间:2012-11-29 18:41:38

标签: c malloc

以下代码:

#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 个答案:

答案 0 :(得分:7)

f尚未指向任何位置,因此取消引用它(*f)无效且行为未定义。

答案 1 :(得分:4)

您将malloc-ed内存分配给* f,这是未定义的行为,因为f未初始化。 改为

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

答案 2 :(得分:2)

您必须先分配f

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

然后您可以分配*f

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

答案 3 :(得分:1)

动态分配的一般习惯是

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

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

因此,分配f的正确方法是:

f = malloc(sizeof *f)

在C中不需要强制转换,不鼓励投射malloc的结果。由于表达式*f的类型为FILE *sizeof *fsizeof (FILE *)相同,但使用sizeof *f除外,您无需担心制作确保你有正确的类型。