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'使用
补救?
答案 0 :(得分:4)
我认为这不是你想做的事。
假设您希望openUpNow()
将文件打开到x
和y
,您应该使用:
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
}
换句话说,您需要将指针x
和y
的地址传递给函数。
由于您的代码现在是正确的,因此对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
中,x
和y
未初始化且具有垃圾值。然后将这些值传递给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);
}