Stevens 책에 있는 예제인데 빠진 코드가 있는거 같아서요..

nan392의 이미지

안녕하세요 다들~ :D
다름이 아니라 UNIX programming을 stevens씨 책으로 공부중인데요
안에 포함된 라이브러리중 path_alloc이란 함수에 코드인데요
아무리 보아두 마지막 malloc하기 전에 size 변수가 NULL값인지 체크하는 부분이 빠진거 같아서요.
소스 코드는 다음과 같습니다

#include        <errno.h>
#include        <limits.h>
#include        "ourhdr.h"

#ifdef  PATH_MAX
static int      pathmax = PATH_MAX;
#else
static int      pathmax = 0;
#endif

#define PATH_MAX_GUESS  1024    /* if PATH_MAX is indeterminate */
                                      /* we're not guaranteed this is adequate */
char *
path_alloc(int *size)
                                /* also return allocated size, if nonnull */
{
        char    *ptr;

        if (pathmax == 0) {             /* first time through */
                errno = 0;
                if ( (pathmax = pathconf("/", _PC_PATH_MAX)) < 0) {
                        if (errno == 0)
                                pathmax = PATH_MAX_GUESS;       /* it's indeterminate */
                        else
                                err_sys("pathconf error for _PC_PATH_MAX");
                } else
                        pathmax++;   /* add one since it's relative to root */
        }

        if ( (ptr = malloc(pathmax + 1)) == NULL)
                err_sys("malloc error for pathname");

        if (size != NULL)
                *size = pathmax + 1;
        return(ptr);

시스템에서 허용하는 Path의 최대값을 사용해서 메모리를 할당해주는 코드인데
if ( (ptr = malloc(pathmax + 1)) == NULL)이 부분을 실행하기 전에
if (size == NULL)이란 조건을 체크해야 되는 거 같아서요
그래야 전달 받은 인수가 NULL이면 시스템 임의로 메모리를 할당하고
인수가 있으면 그곳에 메모리를 할당하게 되는것이 맞는거 같아서 이렇게 여쭤봅니다.
지금 이 소스 코드 그대로 사용한다면
path_alloc함수를 NULL이 아닌 인자를 주어서
호출하면 메모리 할당을 두 번 다 할꺼 같은데..
아니면 제가 잘못 이해하고 있는건지...
답변 부탁드리겠습니다.

saxboy의 이미지

*size 는 alloc 한 스트링의 길이가 되겠지요. 지금 코드가 맞는것 같은데요. 말씀하신 대로 되려면 프로토타입이 void path_alloc( char **ptr, int *size)가 되어야겠지요.

nan392의 이미지

아 생각해 보니 변수명이 size라면 saxboy님 말대로 길이가 되겠네요~
근데 제가 위와 같이 생각했던 이유는 NULL 값이 아닌 경우는 처리를 해주었는데 NULL값인 경우는 그냥 무시를 하고 정확한 size 의 의미가 도대체 먼지 헷갈리네요~

최병현의 이미지

제가 봐서는 path_alloc의 사용 목적(?) 때문 인 것으로 생각됩니다.

실제 코드에서는 size에 대한 memory allocation이 없습니다.
그러니 size에 대한 책임은 호출 측에 있는 것입니다.

즉, path_alloc()을 호출한 측에서 size를 NULL로 주지 않으면
다시 말해 이미 메모리가 할당된 변수의 address를 주었다면
*size에 pathmax+1 을 대입하여 돌려줄 것입니다.

만일 size를 NULL, 그러니까 path_alloc(NULL)로 호출하였다면
호츨 측에서 *size에는 관심이 없다는 의미로 받아 들이시면 됩니다.

To be a rich

nan392의 이미지

아 그렇군요..
하긴 이 path_alloc()을 호출하는 다른 코드를 살펴보았는데 size값은 상관을 안하더군요..

감사합니다~

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.