[질문]fopen에 관하여 질문있습니다

wildrunner의 이미지

fopen에 대한 질문이라기보다 프로그램 내부적인 구조에 대한 문제인데요

APUE 의 program 7.6에 다음과 같은 코드가 있습니다

#include <stdio.h>
#define DATAFILE "datafile"

FILE *
open_data(void)
{
     FILE *fp;
     if((fp = fopen(DATAFILE, "r")) == NULL)
        return NULL;
     return fp;
}

main함수에서 open_data를 호출하면 fp가 제대로 리턴되는 건가요?

물론 fp는 포인터이기는 하지만 fopen이 open_data의 스택 프레임에

FILE구조체를 저장하고 있다면 open_data가 리턴시 FILE구조체에

접근할 수 있지만, 만약 open_data리턴시 바로 다음 함수를 호출해버리면

FILE구조체가 붕괴(?)되버리지 않나요?

물론 fopen이 FILE구조체를 저장할때 힙을 사용한다면 문제가 되지 않겠죠.

책보다가 머리속이 정리가 안되어서 질문 드려봅니다.

설명 부탁드립니다.

맹고이의 이미지

Program 7.6 Incorrect usage of an automatic variable.

끝까지 읽어보세요. 설명을 해놓았군요.

그리고 fopen은 static 영역에 파일포인터를 저장하지 않을까 싶습니다.

bw001730의 이미지

제가 생각할때
fopen은 static영역에 저장할수 없을듯합니다...........
동적으로 어떻게 static 영역에 저장할수 있나요?
(그런 함수나 문법이 없는 것 같은데..............)
static 영역은 프로그램 로딩시 결정되어 버릴텐데요
동적으로 할당될수 있다면 static 영역이라고 볼수 없죠

그리고 힙영역에 생성되는 것이 맞을 것 같습니다.
FILE*fp = fopen(...);
이 때 파일 구조체가 힙에 생성되어 fp는 힙을 가리키고
따라서 함수 리턴해도 문제가 없습니다.

리눅스에서................
저 함수를 두번호출하면 힙영역에 두개의 FILE구조체가 생성됩니다.
그리고......두개의 FILE 구조체 내부에는 서로 다른 파일 디스크립터가
저장될테고(fileno(FILE *fp)로 찍어보세요)
각각의 디스크립터는
서로 다른 커널영역 파일 참조 구조체(struct file) 를 참조할 것이고
이 두개의 struct file 구조체는 하나의 (같은)inode 구조체를 참조하게 됩니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.