以下代码:
#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上尝试了此代码并复制了该行为。
f
还没有指向任何地方,所以取消引用它(*f
)是无效的,并且具有未定义的行为。
您正在将 malloc-ed 内存分配给 *f,这是未定义的行为,因为 f 未初始化。更改为
f = (FILE **)malloc( sizeof(FILE *))
您必须先分配f
f = (FILE **)malloc( sizeof(FILE *))
然后您可以分配*f
*f = (FILE *)malloc( sizeof(FILE))
动态分配的一般习语是
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
你不需要担心确保你拥有正确的类型。