[완료] 아큐먼트로 넘겨진 변수의 값 변경이 가능한지요?

neohwang의 이미지

아래의 func() 함수의 아규먼트로 넘겨진 변수의 값을 함수내에서 바꾸는 것이 문제가 없는지요?

물론 실행해 보면 문제 없이 결과가 나오는 데요.. 혹시 문제를 일으킬 소지가 있는지 궁금합니다.

#include <stdio.h>
 
void func(int a);
 
int main(int argc, char *argv[])
{	
  	func(10);
  	return 0;
}
 
void func(int a)
{
  	printf("%d\n",a);
  	a=5;
  	printf("%d\n",a);
}

익명사용자의 이미지

변수 범위에 관한 문제는 단순하면서도 중요한 문제라 게시판에서 답변을 구하기 보단 C 입문서를 구해 읽거나 주위 아는 이에게 제대로 설명을 듣는 것이 neohwang님에게 도움이 될 듯합니다.

책 보실 때 global variable, local variable, automatic variable, static, extern 등의 개념에 주의하시면 됩니다.

참고로 C 함수는 항상 call by value입니다.

neohwang의 이미지


조언해주신 사항에 대해서는 시간이 허락될 때.. 기본서를 보도록 하겠습니다.

지금 닥친 문제는 지금 당장 결정해야 할 시급한 문제라,

급히 도움을 청하오니..

혹시 위 사항에 대한 답변을 우선 주실 수 없는지요?

Hyun의 이미지

main에서 func를 호출할 때 매개변수로 넘긴 10 의 값이 저장되는 곳은 func이 사용하는 영역이라고 생각하면 됩니다.
이 func가 사용하는 변수영역(func의 stack frame)은 func 함수가 종료하면서 파기되기 때문에 func 함수 안에서 어떻에 사용하더라도 상관이 없습니다..

neohwang의 이미지

좋은 하루 되세요..

바라미의 이미지

우선 함수의 매개변수가 가지는 범위는 함수범위입니다.
다시 말하자면 a가 유효할수 있는 범위는 변수 a 가 선언된곳(즉 매개변수로 선언된곳) 부터
함수가 끝나는 곳까지입니다.

함수가 호출 되면 변수 a가 선언되게 되고, 그 함수 내에서 a 라는 변수를 사용할수 있게 됩니다.
물론 a 라는 변수의 내용을 바꿀수도 있겠지요. 하지만 함수를 벗어나게 되면 그 변수는 사용할 수 없게 됩니다.

작성하신 코드는 변수를 auto 로 지정하셨습니다.(이건 생략이 가능하기에 그런 것입니다.)
그럴 경우 대상체 a변수는 함수가 시작할 시 자동으로 공긴이 할당 된 후, 함수 호출이 끝나게 되면.
자동으로 할당된 공간이 파기되게 됩니다.

함수 정의에서 매개변수에 static 을 사용할 수 있는지는 아직 공부를 많이 하지 못해 모르겠으나,
함수 혹은 블럭 내부에서 static 을 사용하게 된다면, 그 변수는 프로그램 시작시에 공간이 할당되게 됩니다.
따라서 한번의 함수 호출에서 변수를 변경 시킨 후, 다시 한번 함수를 호출하게 된다면.
첫번째 함수 호출때 변수에 저장한 값이 두번째 함수에서 사용되게 됩니다.
물론 이때에도, 변수의 scope 에 따라서 함수 바깥에서는 해당 변수를 인식할 수 없습니다.

neohwang의 이미지

자세한 설명 짐심으로 감사드립니다.

좋은 하루 되세요..

익명사용자의 이미지

참고로 적자면, 함수 정의에서 매개변수에 지정할 수 있는 storage-class specifier는 register 뿐입니다.

댓글 달기

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