C语言 malloc() 在 Windows 上崩溃,但在 Mac 上不崩溃



以下代码:

#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 *fsizeof (FILE *)相同,只是使用sizeof *f你不需要担心确保你拥有正确的类型。

相关内容

  • 没有找到相关文章