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

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上尝试了此代码,并复制了该行为。


"我已将整个程序简化为以上内容" - 做得好! - Thomas Padron-McCarthy
实际上,在你删除 if 语句中的一个左括号之前,代码是无法编译通过的。在那里你开了一个括号,但是却没有关闭一个。 - Daniel Fischer
@DanielFischer 哎呀,转录中有错别字了;现在已经修正了。 - Smalltown2k
4个回答

7

f 目前还未指向任何地址,因此对其进行解引用 (*f) 是无效的,并且具有未定义的行为。


这与 int *j; *j = 1; 是同样的问题。 - David Schwartz

4
您正在将malloc分配的内存分配给未初始化的*f,这是未定义的行为。 改为:
f = (FILE **)malloc( sizeof(FILE *))

2

首先需要分配f

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

然后你可以为*f分配内存。

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

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 时你不需要担心是否选择了正确的类型。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接