2013-08-11 1 views
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를 사용하는 것이 안전하다 C에서 로컬로 다른 함수에서 할당 파일 파일 디스크립터를 반환하는 것입니다. 그것이 안전하다면 그 이유는 무엇입니까?는 안전

+0

그것은 FILE 포인터입니다. 예를 들어,'open' 시스템 호출에서 반환 된 것과 같은 파일 설명자가 아닙니다. – squiguy

답변

2

로컬 변수 자체에 대한 참조가 아닌 파일 설명자의 값을 반환합니다. 이것은 파일 디스크립터의 값이 프로세스에 고유하므로 완벽하게 안전하다.

파일을 열면 운영 체제에서 해당 파일을 나타내는 항목을 만들고 열린 파일에 대한 정보를 저장합니다. 따라서 N 개의 파일이 열리면 N 개의 정수가 생깁니다. 각각은 파일 설명 자입니다. 그것들은 열려있는 파일을 유일하게 나타내는 정수입니다. 프로세스가 10 개의 파일을 열면 Process 테이블에는 파일 설명자에 대한 10 개의 항목이 있습니다.


사이드 노트 : fopen()의 결과는 일반적으로 사용할 수있는 다음 무료 정수입니다. 위의 예제 프로그램에서는 대부분 1 & 2stdin에 규칙에 의해 할당된다 desc, 0로 파일 기술자에 포함 된 3의 값, stdout & stderr있을 것이다.

0

시도해 보셨습니까?

그것은 어떤 문제

나는 확실히 작동합니다

스크래치없이 작동합니다.

+0

시도만으로 충분하지 않습니다. 만약 당신이 UB를 가지고 있다면 (그것은 OP가 궁금해하는 것입니다), 성공할 수도 있습니다. (하지만이 경우에는 작동합니다.) – glglgl

+0

@glglgl - 나는 조금 경박했습니다. IMHO –

5

FILE 개체는 BestTry 기능에 로컬 인 이 아니고입니다. 이 함수는 FILE 개체에 대한 포인터를 가져오고 해당 포인터는 실제로 로컬이지만 개체 자체는 아닙니다.

포인터를 반환하면 실제 FILE 개체가 계속 실행됩니다. (시스템 호출의 반환 값을 확인하지 않는다는 것을 제외하고는 괜찮습니다. 따라서 실패 할 때 프로그램을 디버깅하는 데 매우 힘든 시간을 갖습니다.)

+0

네가'return fopen (...);'이라고 쓰면 걱정할 지역 변수조차 없다. –

1

먼저이 값은 파일 설명자가 아닌 FILE * 포인터입니다. . 예를 들어, open은 파일을 액세스하기 위해 파일 설명자를 반환하고, socket은 소켓을 조작하기 위해 파일 설명자를 반환합니다.

그렇습니다. 함수의 로컬 객체를 가리 키지 않기 때문에 안전합니다.

1

변수를 로컬에 할당하지 않았으므로 변수에 대한 포인터를 로컬로 할당하기 때문에이 경우 안전합니다. 변수 자체는 힙에 저장되어 있으며 자신을 닫거나 할당을 취소하지 않은 한 안전합니다.

1

간단한 대답은 예입니다. FILE 유형 설명자에 할당 된 메모리 fopen은 힙에 있으므로 함수에서 사용할 수 있습니다.

FILE 포인터가 사용 후 한 번만 fclose에 의해 닫히지 만 모든 코드 연습은 꼭 안전합니다.