在C语言中,返回来自另一个函数本地分配的文件描述符是否安全?

3
#include <stdio.h>
#include <string.h>

FILE * BestTry();

int main()
{
    char arr[] = "hello";
    FILE * desc = BestTry();
    fwrite(arr,1,5,desc);
    fclose(desc);
}

FILE * BestTry()
{
    FILE * retDesc = fopen(".\\hello.dat","w+");
    return retDesc;
}

因为我在函数BestTry中为局部变量分配了内存,所以是否可以安全地使用desc进行任何用途?如果可以安全使用,那么原因是什么?


那是一个文件指针,不是像从open系统调用返回的文件描述符那样的东西。 - squiguy
6个回答

5
< p > FILE对象不是局限于你的BestTry函数。该函数获取FILE对象指针,该指针确实是局部的,但对象本身并非如此。

你所做的是正确的,当你返回指针时,实际的FILE对象仍然存在。(好吧,除了你没有检查系统调用的返回值,所以当程序失败时,你会遇到极大的困难来调试它。)


是的,如果你写了 return fopen(...);,你甚至不需要担心本地变量的问题。 - Mr Lister

3
您返回的是文件描述符的值,而不是对本地变量本身的引用。这是完全安全的,因为文件描述符的值对于一个进程是唯一的。
当您打开一个文件时,操作系统会创建一个条目来表示该文件并存储有关该打开文件的信息。因此,如果有N个文件已打开,则将有N个整数,每个整数都是文件描述符。它们只是唯一表示打开文件的整数。如果您的进程打开了10个文件,则您的进程表将具有10个文件描述符的条目。
附注:fopen()的结果通常是下一个可用的空闲整数。在上面的示例程序中,file-descriptor desc中通常包含一个值为3,因为0、1和2依照惯例分配给stdin、stdout和stderr。

1
首先,这是一个FILE *指针,而不是文件描述符。我们使用文件描述符来访问文件、套接字等,它是一个int类型。例如,open返回文件描述符以访问文件,socket返回文件描述符以操作套接字。

同时,这是安全的,因为它不指向函数中的本地对象。


1
在这种情况下,它是安全的,因为您没有在本地分配变量,而是在本地分配变量的指针。变量本身存储在堆中,只要您自己没有关闭/释放它,它就是安全的。

1
简单的答案是肯定的。fopen分配给FILE类型描述符的内存位于堆中,因此可以在函数外部使用。
只要在使用后仅通过fclose关闭FILE指针一次,整个代码实践就是绝对安全的。

0

你试过了吗?

它应该可以无任何问题地工作。

算了,我肯定会让它工作的。


仅仅尝试是不够的。如果你有未定义行为(这就是 OP 想知道的),它也可能成功。(但在这种情况下,它是有效的。) - glglgl
@glglgl - 我有点轻率了。在我看来,这似乎是一个相当琐碎的问题。 - Ed Heal

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