20140326 (배열)
28일차
----------------
Array ( 배 열 )
----------------
- 배열 초기화
char caString[256] = "";
char caString[256] = {0};
둘다 0(NULL)로 초기화 된다.
- Call by Address, Call by Value
이것은 함수에 인수를 다룰 때 쓰는 방법이다.
Call by Address : 주소를 넘겨 호출.
Call by Value : 값을 넘겨 호출.
ex) 예제 소스
#include <stdio.h>
void CallByValue(int, int);
void CallByAddress(int *, int *);
int main()
{
int iNum1 = 10;
int iNum2 = 100;
CallByValue(iNum1, iNum2); // Call By Value
printf("CallByValue() -> %d %d \n", iNum1, iNum2);
CallByAddress(&iNum1, &iNum2); // Call By Address
printf("CallByAddress() -> %d %d \n", iNum1, iNum2);
return 0;
}
void CallByValue(int n1, int n2)
{
int iTemp;
iTemp = n1;
n1 = n2;
n2 = iTemp;
}
void CallByAddress(int * n1, int * n2)
{
int iTemp;
iTemp = *n1;
*n1 = *n2;
*n2 = iTemp;
}
출력 화면
CallByValue 는 말 그대로 main에 있는 변수의 값만
가져와 쓰기 때문에 CallByValue 에서 무슨 짓을 해도
main의 변수에 접근할 수 없다.
CallByAddress 는 말 그대로 main에 있는 변수의 주소값을
가져와 쓰기 때문에 CallByAddress 에서 무슨 짓이든
main의 변수에 접근할 수 있다.
- 여기서 잠깐 무시무시한 scanf()의 무서움을 보자.
ex) 예제 소스
#include <stdio.h>
int main()
{
char cStr[8];
printf("문자열 입력 : ");
scanf("%s", cStr);
printf("입력 받은 문자열 : %s \n", cStr);
return 0;
}
출력 화면
여기까지는 별 문제 없어 보인다.
하지만
입력한 문자가 9개를 넘어가면서 오류가 발생한다.
위에서 cStr[8] 크기를 8byte로만 지정했기 때문에
9byte (9글자)를 받았을때에 오류가 난다.
지금까지 scanf("%d", &iNum); 이렇게 항상 변수 앞에 &를 붙였는데
포인터를 배우면서 보았듯이 주소값을 넘겨주기 때문에
scanf() 함수에서 main함수의 변수를 만질 수 있었다.
그래서 그 이상의 값이 들어왔을때 오류가 나는 것을 볼 수 있다.
상위 버전 컴파일러로 컴파일시 scanf 함수 사용만으로도 warning을 출력한다고 한다.
그러니 지금은 scanf() 함수를 쓰지만 나중에 안정성을 위해
다른 함수를 사용해야할 것이다.