以下代码:
#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上尝试了这个代码并复制了行为。
答案 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 *f
与sizeof (FILE *)
相同,但使用sizeof *f
除外,您无需担心制作确保你有正确的类型。