구조체의 반환....이상해요~!

umean2me의 이미지

제가 기억하기로 C에서 구조체를 인자로 넘기거나 반환하는것이
안되었던 것으로 기억하고 있습니다. 그래서 포인터로 많이 넘긴거로 생각되는데....(c++을 마니 써서...c를 마니 까먹은 상태라..)근데 해보니까 되네요?

제 기억이 틀렸습니까? 제가 C를 접한건 94년즈음 이거든요.

다음의 코드는 잘 됩니다. 구조체가 일반 INT같은 타입처럼

복사되어 함수로 넘어오고 복사되어 리턴됩니다....다른 분들은 기억이 어떠신지...아니면 아시는 뭔가라도.....흑...

#include <stdio.h>

typedef struct
{
    int i;
    int j;
    int cc;
} AA;

AA ttt(AA a)
{
    printf("%p\n", &a);
        a.i = 3;
        return a;
}

int main(void)
{
    AA a;
    AA b;

    printf("%p\n", &a);
    b = ttt(a);
    printf("%d\n", b.i);
}
Fe.head의 이미지

umean2me wrote:
제가 기억하기로 C에서 구조체를 인자로 넘기거나 반환하는것이
안되었던 것으로 기억하고 있습니다. 그래서 포인터로 많이 넘긴거로 생각되는데....(c++을 마니 써서...c를 마니 까먹은 상태라..)근데 해보니까 되네요?

제 기억이 틀렸습니까? 제가 C를 접한건 94년즈음 이거든요.

다음의 코드는 잘 됩니다. 구조체가 일반 INT같은 타입처럼

복사되어 함수로 넘어오고 복사되어 리턴됩니다....다른 분들은 기억이 어떠신지...아니면 아시는 뭔가라도.....흑...

#include <stdio.h>

typedef struct
{
    int i;
    int j;
    int cc;
} AA;

AA ttt(AA a)
{
    printf("%p\n", &a);
        a.i = 3;
        return a;
}

int main(void)
{
    AA a;
    AA b;

    printf("%p\n", &a);
    b = ttt(a);
    printf("%d\n", b.i);
}

기억이 틀리셨습니다.

값으로 반환이 가능합니다.

다만 overhead 가 발생하죠.

int 형과 비슷하다고 보시면 됩니다.

#include <stdio.h>

typedef struct
{
    int i;
    int j;
    int cc;
} AA;

위 AA structor 를 int라고 가정해 볼까요?

typedef int AA;

그럼 아래와 같이 되겠죠?

typedef int AA;

AA ttt(AA a)
{
    printf("%p\n", &a);
        a.i = 3;
        return a;
}

AA == int 이므로 치환을 하면

int ttt(int a)
{
    printf("%p\n", &a);
        a.i = 3;
        return a;
}

입니다.

고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"

doldori의 이미지

umean2me wrote:
제가 기억하기로 C에서 구조체를 인자로 넘기거나 반환하는것이
안되었던 것으로 기억하고 있습니다. 그래서 포인터로 많이 넘긴거로 생각되는데....(c++을 마니 써서...c를 마니 까먹은 상태라..)근데 해보니까 되네요?

제 기억이 틀렸습니까? 제가 C를 접한건 94년즈음 이거든요.


umean2me님의 기억이 맞을 수도 있습니다. 구조체의 복사와 대입은 표준에
잘 정의가 되어 있습니다만, 표준 이전에서는 그것이 안되었습니다. C가 표준화된
것이 90년(실질적으로는 89년)이었는데, 94년 당시까지 표준을 따르지 않는
컴파일러가 상당히 많이 사용되었을 수 있고(C99가 발표된 지 6년이 지났지만
아직까지 그를 따르는 컴파일러가 흔치 않은 걸 보면 무리도 아니죠.) 그때의 기억으로
안된다고 생각하실 수도 있겠지요.

뭐, 별로 중요한 얘기는 아닙니다. 지금은 된다는 것이 중요하죠.

Necromancer의 이미지

구조체 자체를 인수로 넘기거나 리턴할경우에는 해당 구조체 크기만큼의 공간을 확보하고
구조체 내부 멤버들을 다 복사하죠.
이에 따른 오버헤드는 엄청나죠. 스택도 엄청 잡아먹고요.

Written By the Black Knight of Destruction

댓글 달기

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