[C] 변수 여러개 선언, 초기화 할때 주의점


C언어에서 자료형이 같은 변수를 여러개 선언할땐 콤마(,)로 구분지어 선언합니다.

int a,b;

이것을 0으로 한꺼번에 초기화 할땐 어떻게 해야할까요?

 

저는 처음에 이런식으로 진행했습니다.

#include <stdio.h>


int main(){
	int a, b = 0;
	printf("%d %d", a,b);
	return 0;
}

이렇게 쓰고 혹시 두개가 초기화가 제대로 안됬을까 a,b도 출력해봤더니 0 0으로 정상 출력되어서 아무런 의심도 하지 않았죠.

 

이런 생각으로 백준을 푸는데 너무 쉬운문제가 통과를 안하는겁니다..

 

https://www.acmicpc.net/problem/5596

 

5596번: 시험 점수

대한고등학교에 재학 중인 민국이와 만세는 4과목(정보, 수학, 과학, 영어)에 대한 시험을 봤습니다. 민국이와 만세가 본 4과목의 점수를 입력하면, 민국이의 총점 S와 만세의 총점 T 중에서 큰

www.acmicpc.net

이 문제인데 값 4개를 2번 입력받고 각각 총합을 구한뒤에 더 큰 총합을 출력하는 간단한 문제인데..

 

#include <stdio.h>


int main(){
	int result1, result2 = 0;
	int student1[4]; //민국 
	int student2[4]; //만세 
	
	for (int i = 0; i < 4; i++){
		//배열의 이름은 주소이나
		//각요소에 입력받을땐 & 기호를 붙여서 접근해야한다. 
		
		scanf("%d", &student1[i]);
		result1 += student1[i];
	}
	
	for (int i = 0; i < 4; i++){
		scanf("%d", &student2[i]);	
		result2 += student2[i];	
	}
	
	if(result1 > result2){
		printf("%d", result1);
	} else if(result1 < result2){
		printf("%d", result2);
	} else{ //동점일땐 민국이의 총점 출력 
		printf("%d", result1);
	}
	
	return 0;
}

코드를 봐도 아무런 이상도 없고 값도 제대로 출력되었습니다. (Dev C++ 기준)

 

도무지 모르겠어서 질문글도 올리고 했는데 답변으론 result1이 제대로 초기화 되지 않았다고 합니다. 띠용?

 

이상해서 다음코드를 실행해봤습니다.

 

#include <stdio.h>


int main(){
	int a, b = 100;
	printf("%d %d", a,b);
	return 0;
}

뭐야.. 진짜 초기화가 안됐잖아?

 

초기화가 안되면 로컬변수는 기본적으로 쓰레기값(이상한값)을 가지게 되는데 Visual Studio 같은 프로그램은 예전엔 아예 디버깅때 오류를 뱉었던거 같은데 Dev C++은 0이나 1이 나와서 하필이면 0이 나와서 초기화가 됬다고 착각했던 겁니다.

 

0말고 다른값 넣어볼껄 하필이면 왜 0을 넣었을까요 ㅠㅠ

 

그래서 아실분들은 아시겠지만 어쨌든 여러개를 초기화할땐 이렇게 써야 합니다

 

#include <stdio.h>


int main(){
	int a = 100, b = 100;
	printf("%d %d", a,b);
	return 0;
}

이런 기초적인걸 모르고 살았다니.. 허탈하네요

여러분들은 저같은 실수를 안하시길 바랍니다~~

COMMENT WRITE

  1. 일반적인 운영체제와 컴파일러 조합에서 전역 변수(.bss)와 HEAP 영역은 할당 시 초기화(=0x00 으로 값을 채움)를 수행하므로 따로 변수 초기화를 하지 않아도 항상 문제 없이 동작합니다. 하지만 스택은 할당시 따로 초기화를 하지 않습니다. 만약 초기화를 한다면 매 함수 호출마다 쓰기로 잡아먹는 시간이 꽤 생길테니까요. 그럼에도 불구하고 Visual Studio 로 개발할때 문제가 없었던것은, MS Compiler 디버깅 프로필이 기본적으로 1. 매 함수 호출 시스택 초기화, 2. 스택 임계영역 보호코드 삽입 등을 포함하고 있기 때문입니다. 그렇다보니 Visual Studio 로 C/C++ 개발 시 지역 변수를 초기화 해주지 않아도 "디버깅 모드"로 빌드하면 동작에 아무런 문제가 생기지 않습니다.

    과도한 친절함(?) 때문에 오히려 혼란을 일으키는것 같습니다.

    • 오 비주얼 스튜디오 구버전에서는 쓰레기값 사용시 디버깅 오류 났던거같은데 요즘은 그냥 아예 초기화까지 해주는군요?? 몰랐네요.. 좋은 정보 감사합니다~

    • 하하, 제가 연식이 조금 되어서... VS 6 시절과 VS 7 시절 까지는 확실히 그랬었는데, 오히려... 지금은 잘 모르겠네요.