지역변수와 전역변수 초기값
글쓴이: rootuser7 / 작성시간: 월, 2010/03/08 - 10:47오후
안녕하세요 ?
초보적인 질문이긴 한데요... 실제 프로그램 예제마다 좀 다르게 coding이 되어 있어서 문의를 드립니다.
C언어에서 함수내에 사용되는 지역(자동)변수를 초기화 하지 않고 실행했을 때, default값은 0으로 초기화 되는지요 ?
아니면, 쓰레기값으로 초기화 되는지요 ?
또한 C언어에서 전역 변수를 초기화 하지 않고 실행했을 때, default값은 0으로 초기화 되는지요 ?
아니면, 쓰레기값으로 초기화 되는지요 ?
즉…
int gloval_value;
int main(void)
{
int local_value;
…
return 0;
}
을 컴파일 후 실행시에 gloval_value과 local_value의 최초값은 어떤 값이 들어가 있습니까?
답변 감사드립니다.
Forums:
그 메모리 주소에
그 메모리 주소에 있던 값이 그대로 들어가겠죠.
하여튼 변수 선언하고 초기화하지 않고 쓰는 일은 우간다에서는 상상도 할 수 없는 일입니다.
한국에서는 어떠신지.
위의 경우
global_value는 0으로 초기화되고 (.bss 영역에 들어가죠)
local_value는 알 수 없습니다.
좌간다/우온다/좌온다 에서도 무조건
무조건 쓰기전에 초기화해서 써야 안심입니다.
자동을 믿지 마세요~~~!!
무조건 초기화가
무조건 초기화가 오히려 위험한게 조건부로 사용되는 로컬 변수들의 경우 무조건 초기화를 해버리면 컴파일러가 초기화되지 않은 값 사용을 잡아내 경고해줄 수 없습니다. 컴파일러가 경고해주면 고치면 될 걸 엉뚱한 초기값으로 실행하는 경우가 생기고 장기적으로 관리성도 떨어집니다. 의도를 가장 왜곡없이 동료 프로그래머와 컴파일러에게 전달할 수 있는 코드를 쓰는 게 좋은데 의미없는 초기화 같은 건 코드 작성자의 의도를 불분명하게 합니다.
그냥 무조건 초기화가 아닌 쓰기전에 초기화의미 입니다.
글에 분명 그냥 쓰기전에 초기화라는 의미 였습니다. 그리고 초기화가 프로그래머의 의도를 왜곡한다는 것은 제가 좀 몰라서 그런지 처음 들었습니다. 컴파일러가 경고를 하면 수정하는 것도 어차피 초기화라고 생각 됩니다. 동료 프로그래머가 초기화 경고를 보고 수정하라는 뜻이라면, 더욱 힘들지 않을까 생각 됩니다.
음, 오해인가요?
음, 오해인가요? 예를 들면
int a;
....
if (xxx which implies yyy)
a = x;
....
if (yyy)
b = 2 * a;
이런 코드가 있을 때, int a = 0; 이런식으로 초기화해버리면 좋지 않다는 뜻이었습니다. 로직상 쓰레기 값인 경우엔 쓰레기 값이도록 두는 게 좋습니다.
무조건 쓰기전에 초기화라는게 어떤 의미인가요? if (xxx) a = x; 를 무조건 쓰기전 초기화라고 부르긴 힘들 것 같은데요.
보통 전역변수가
보통 전역변수가 있는 영역은 프로그램 실행전에 0으로 밀어버립니다. 그래서 초기화를 안해도 0이 들어가 있죠. 그러나 임베디드 쪽에서는 간혹 이 부분을 생략하는 경우가 있다고도 합니다. C 코딩 하다가 잘 모르겠는 부분은 암시적으로는 문제가 없더라도 명시적으로 써주는게 좋은 것 같습니다. (물론 이걸 싫어하는 분들도 있기는 하죠.)
댓글 달기