[C/C++] 배열에서 사이즈 설정하는 이유가 있나요?
글쓴이: ryan0802 / 작성시간: 월, 2011/06/27 - 4:26오후
안녕하세요.
씨 초보입니다.
그냥 배열을 만들다가 생각해보니 이유를 모르겠어서 질문드립니다.
예를 들어서,
char str[5] = "Good";
char str[ ] = "Good";
이 둘은 똑같은 결과를 내잖아요.
그런데 뭐하러 [ ] 안에 사이즈를 지정하는 건가요?
혹시 그 안에 입력될게 특정 사이즈를 넘어가면 안되는 경우에 사용하는 건가요?
그냥 상상을 해보았는데요,
뭐, 아이디를 10자 이상 넣지 말아라, 비번은 16자리까지만 가능하다,
이럴때 쓰이는 것인가요?
궁금합니다~!
Forums:
C언어에서 변수가 메모리에 어떻게 생성되는지를
C언어에서 변수가 메모리에 어떻게 생성되는지를 이해하셔야 위 의문에 대한 답이 풀릴겁니다.
배열에 사이즈를 지정해 줘야만,
이후에 선언되는 변수의 위치를 지정할 수 있기 때문입니다.
제 답변이 아마 이해가 안되실 겁니다.
하지만 다른 경로를 통해서
C언어에서의 함수 파라매터와 변수가 메모리에 어떻게 생성되고,
caller와 callee의 메모리 사용관계를 잘 찾아보고 공부하신다면
그때는 이해 하실수 있을 겁니다.
----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라
위에것은 명시적으로 할당될 char형 배열의 크기를
위에것은 명시적으로 할당될 char형 배열의 크기를 적어주는 거고
아래것은 문자열 상수 "Good"의 길이를 보고 C 컴파일러가 자동적으로 배열의 크기를 알아서 잡으라는 의미입니다.
대부분 그냥 생략해도 되지만, 만약 배열 안에 담길 문자열의 길이가 변할 수 있다면 넉넉한 크기로 미리 잡아두는게 유리합니다.
char password[33] = "abcde"; // 배열의 크기가 32+1이므로 문자열의 길이는 최대 32자(+null문자)까지 가능하고 기본값은 abcde
char password[] = "abcde"; // 배열의 크기가 5+1으로 자동으로 생성되므로 5자 이상의 문자열을 저장하는 건 불가능
그리고, 위의 코드건 아래 코드건 배열의 크기를 벗어나서 참조하는건 무조건 안됩니다.
char s1[5] = "Good";
char s2[] = "Good";
s1과 s2는 똑같이 크기가 4+1인 배열이므로, 4자 이하의 문자열만 저장 가능하고, 그보다 긴 문자열을 저장하게 되면 문제가 생깁니다.
여기서 중요한건, C/C++에서는 배열의 경계선을 넘어 접근하는 잘못된 행동에 대해서
절대 검사하거나 제한하지 않는다는 겁니다.
예를 들어 크기가 3인 char형 배열 c에 대해서
char c[3] = "ab";
c[3] = '\0';
배열 c의 길이가 3이므로 첨자로 가능한 숫자는 0, 1, 2 이렇게 세개 뿐입니다.
3 이상의 숫자를 배열 c의 첨자로 사용하면 할당되지 않은 메모리 공간에 접근하게 되므로 오류를 일으킵니다.
이런 코드는 컴파일러가 컴파일시에 자동으로 잡아주지 않고,
일반적으로는 프로그램이 실행될 때에 오동작을 일으키므로
대단히 찾아내기 어려운 오류가 됩니다.
참고로, C에서는 한번 정해진 배열의 크기는 그 뒤에
참고로, C에서는 한번 정해진 배열의 크기는 그 뒤에 변하지 않습니다.
char str[] = "abcde";
이렇게 일단 선언이 되면 그 뒤에 str의 크기는 5+1에서 절대로 변하지 않습니다.
C에서의 문자열은 무척이나 불편하고 제한된 개념이며,
매우 간단한 작업조차도 프로그래머가 손수 하나하나 직접 해줘야 합니다.
댓글 달기