返回文件从其他函数本地分配的文件描述符是否安全在C中

时间:2013-08-11 06:57:25

标签: c

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

desc用于任何用途是否安全,因为我正在为函数BestTry中的局部变量分配内存。如果它是安全的那么原因是什么?

6 个答案:

答案 0 :(得分:5)

FILE对象 对象是BestTry函数的本地对象。该函数获取指向FILE对象的指针,该指针确实是本地的,但对象本身不是。

你正在做的很好,当你返回指针时,实际的FILE对象仍然存在。 (好吧,除非您没有检查系统调用的返回值,因此在失败时调试程序将非常困难。)

答案 1 :(得分:3)

您正在返回文件描述符的值,而不是对局部变量本身的引用。这是非常安全的,因为文件描述符的值对于进程是唯一的。

  

当您打开文件时,操作系统将创建一个表示该文件的条目并存储有关该打开文件的信息。因此,如果有N个文件打开,那么将有N个整数,每个都是一个文件描述符。它们只是唯一表示打开文件的整数。如果您的进程打开10个文件,那么您的Process表将有10个文件描述符条目。


旁注fopen()的结果通常是下一个可用的免费整数。在上面的示例程序中,文件描述符3中包含的{strong> desc 值大多为01&amp;按惯例将2分配给stdinstdout&amp; stderr

答案 2 :(得分:1)

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

是的,它是安全的,因为它没有指向函数中的本地对象。

答案 3 :(得分:1)

在这种情况下它是安全的,因为你没有在本地分配一个变量,你在本地分配一个指向变量的指针。变量本身就存在于堆中,只要您没有自己关闭/解除分配,它就是安全的。

答案 4 :(得分:1)

简单的答案是肯定的。为FILE类型描述符分配的内存fopen在堆中,因此可以在函数之外使用。

只要FILE指针在使用后仅被fclose关闭一次,整个代码实践都是安全的。

答案 5 :(得分:0)

你试过吗?

它应该没有任何问题

抓一点

我一定会工作。