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

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

4

6 回答 6

5

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

您所做的很好,FILE当您返回指针时,实际对象仍然存在。(很好,只是你没有检查系统调用的返回值,所以当程序失败时你将很难调试你的程序。)

于 2013-08-11T07:01:24.430 回答
3

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

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


旁注:结果fopen()通常是下一个可用的空闲整数。在上面的示例程序3中,文件描述符中的值通常desc0, 1&2按约定分配给stdin, stdout& stderr

于 2013-08-11T07:00:41.947 回答
1

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

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

于 2013-08-11T07:03:51.223 回答
1

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

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

于 2013-08-11T07:01:24.770 回答
1

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

于 2013-08-11T07:01:49.793 回答
0

你试过了吗?

它应该可以正常工作

从头开始

我一定会工作。

于 2013-08-11T07:01:15.873 回答