投诉FILE *未初始化

时间:2012-01-16 02:42:12

标签: c visual-studio file-io fopen

void openUpNow(FILE *x, FILE *y)
{
    x = fopen("xwhatever", "r");
    y = fopen("ywhatever", "r");
}

int _tmain(int argc,  _TCHAR* argv[ ])
{   
    FILE *x, *y;

    openUpNow(x, y);
}

警告C4700:未初始化的局部变量'x'使用

警告C4700:未初始化的本地变量'y'使用

补救?

3 个答案:

答案 0 :(得分:4)

我认为这不是你想做的事。

假设您希望openUpNow()将文件打开到xy,您应该使用:

void openUpNow(FILE **x, FILE **y)
{
    *x = fopen("xwhatever", "r");
    *y = fopen("ywhatever", "r");
}

int _tmain(int argc,  _TCHAR* argv[ ])
{   
    FILE *x, *y;

    openUpNow(&x, &y);

    //  do stuff


}

换句话说,您需要将指针xy的地址传递给函数。

由于您的代码现在是正确的,因此对openUpNow()的调用不会执行任何操作(并泄漏文件句柄),因为指针是按值传递的。

答案 1 :(得分:2)

FILE *x = NULL;
FILE *y = NULL;

使用未初始化的变量通常会导致未定义的行为,因此编译器会警告它,以便您可以了解这些变量。

此外,您需要通过引用而不是通过值传递指针,或者您在函数内部获得的是原始指针的副本。

void openUpNow(FILE **x, FILE **y)
               ^^^^^^^^^^^^^^^^^^ 

更正版本:

void openUpNow(FILE **x, FILE **y)
{
    *x = fopen("xwhatever", "r");
    *y = fopen("ywhatever", "r");
}

int _tmain(int argc,  _TCHAR* argv[ ])
{   
    FILE *x = NULL;
    FILE *y = NULL;

    openUpNow(&x, &y);

}

答案 2 :(得分:2)

是的,那段代码被打破了。在_tmain中,xy未初始化且具有垃圾值。然后将这些值传递给openUpNow。幸运的是,openUpNow忽略了它们。但是然后你将调用的新值丢弃到fopen。你想要:

void openUpNow(FILE **x, FILE **y)
{
    *x = fopen("xwhatever", "r");
    *y = fopen("ywhatever", "r");
}

int _tmain(int argc,  _TCHAR* argv[ ])
{   
    FILE *x, *y;

    openUpNow(&x, &y);
}
相关问题