抱怨 FILE * 未初始化

发布于 2024-12-27 10:22:52 字数 293 浏览 1 评论 0原文

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”

补救措施?

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);
}

warning C4700: uninitialized local variable 'x' used

warning C4700: uninitialized local variable 'y' used

Remedy?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

对风讲故事 2025-01-03 10:22:52

无论如何,我认为这不是你想要做的。

假设您希望 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() 的调用不会执行任何操作(并泄漏文件句柄),因为指针是按值传递的。

I don't think that's what you want to do anyway.

Assuming you want openUpNow() to open the files into x and y you should use:

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


}

In other words, you need to pass the address of the pointers x and y into the function.

As your code is right now, the call to openUpNow() doesn't do anything (and leaks the file-handles) since pointers are passed by value.

苦行僧 2025-01-03 10:22:52
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);

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

Using Uninitialized variables often results in Undefined Behavior hence the compilers warn of it so that you can be aware of such variables.

Also, you need to pass the pointers by reference and not by value or what you get inside the function is a copy of the original pointer.

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

Corrected version:

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);

}
双马尾 2025-01-03 10:22:52

是的,该代码已损坏。在_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);
}

Yeah, that code is broken. In _tmain, x and y are uninitialized and have garbage values. Then you pass those values to openUpNow. Fortunately, openUpNow ignores them. But then you throw away the new values from the calls to fopen. You want:

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);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文