메모리 할당에 관한 질문 있습니다..

김밥의 이미지

#include

char *ReadUserName(void)
{
char name[30];
printf("What's your name? ");
scanf("%s", name);
return name;
}

int add(int a, int b)
{
int sum = a + b;
return sum;
}

int main(void)
{
int a = 3;
int b = 2;
char * name1;
name1 = ReadUserName();
printf("name1: %s \n", name1);
int c = add(a, b);
printf("%d", c);

return 0;
}

코드를 이런식으로 짯는데요..

원래 메모리 시간때 공부한 내용으로는 지역변수 같은 경우에는 함수가 끝나는 동시에 소멸된다고 알고있거든요..

char*ReadUserName 함수같은경우에는 배운내용이랑 똑같이 적용이 되던데.. 왜 int add 함수는 값이 정상적으로

나오는 건가요..??

(답변에 대해 미리 감사의 말씀 드립니다.)

shint의 이미지

함수 안에 변수는 함수 밖을 나가더라도. 운 좋으면. 값이 남아 있습니다.
해당 주소에 데이터가 남아 있습니다.
char* 는 32비트 4바이트 혹은 64비트 8바이트 주소를 넘깁니다. 값이 아니라. 주소가 넘어갑니다.

int 는 32비트와 64비트 모두. 4바이트 입니다.

4바이트는 값 자체로 넘어갔기 때문에. 유지 될 수 있습니다.

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

김밥의 이미지

알려주셔서 감사합니다 ㅎㅎ

bushi의 이미지

add() 함수는 덧셈 연산의 결과 '값'을 돌려주고,
ReadUserName() 함수는 메모리 '주소값' 을 돌려줍니다.
메모리 '주소값' 자체의 무슨 문제가 있는게 아니라 그 주소가 가리키는 공간이 더 이상 유효하지 않은 것입니다.
'지역 변수' 라는 말 보다는 '지역 메모리 공간' 으로 학습내용을 이해하시는 편이 더 도움이 될 것입니다.

라스코니의 이미지

메모리 할당에 관한것이 아닙니다.
call-by-value에 대한 것입니다. C는 기본적으로 값을 되돌려 주기 때문에 질문하신 분은 이값이 주소값을 가리키는지 아니면 단순히 변수값을 가르키는지에 대해서 혼동이 있는 것 같습니다.

char *ReadUserName(void) 함수 호출의 경우 결과적으로 name 이라는 내부 배열의 주소(값)를 되돌려 주는데 함수 리턴 후 더 이상이 유효(valid)한 영역이 아니기 때문에 사용해서는 안됩니다.

int add(int a, int b) 함수 호출의 경우 단순히 연산의 결과인 sum 값을 넘겨주고 있습니다. 값만을 넘겨주기 때문에 호출한 쪽에서 넘겨받는 순간 호출당한 함수의 역할은 끝납니다. 그래서 문제가 없는 것입니다.

따라서 함수를 설계할 때 뭔가를 넘겨주어야 한다면 자신의 역할이 끝난 후에도 그 값이 계속 유효할지에 대해서 고민해 주어야 합니다.

댓글 달기

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