[C/C++] 배열에서 사이즈 설정하는 이유가 있나요?

ryan0802의 이미지

안녕하세요.

씨 초보입니다.

그냥 배열을 만들다가 생각해보니 이유를 모르겠어서 질문드립니다.

예를 들어서,

char str[5] = "Good";
char str[ ] = "Good";

이 둘은 똑같은 결과를 내잖아요.

그런데 뭐하러 [ ] 안에 사이즈를 지정하는 건가요?

혹시 그 안에 입력될게 특정 사이즈를 넘어가면 안되는 경우에 사용하는 건가요?

그냥 상상을 해보았는데요,

뭐, 아이디를 10자 이상 넣지 말아라, 비번은 16자리까지만 가능하다,

이럴때 쓰이는 것인가요?

궁금합니다~!

나빌레라의 이미지

C언어에서 변수가 메모리에 어떻게 생성되는지를 이해하셔야 위 의문에 대한 답이 풀릴겁니다.

배열에 사이즈를 지정해 줘야만,
이후에 선언되는 변수의 위치를 지정할 수 있기 때문입니다.

제 답변이 아마 이해가 안되실 겁니다.

하지만 다른 경로를 통해서
C언어에서의 함수 파라매터와 변수가 메모리에 어떻게 생성되고,
caller와 callee의 메모리 사용관계를 잘 찾아보고 공부하신다면

그때는 이해 하실수 있을 겁니다.

----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라

익명 사용자의 이미지

위에것은 명시적으로 할당될 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에서는 한번 정해진 배열의 크기는 그 뒤에 변하지 않습니다.
char str[] = "abcde";
이렇게 일단 선언이 되면 그 뒤에 str의 크기는 5+1에서 절대로 변하지 않습니다.

C에서의 문자열은 무척이나 불편하고 제한된 개념이며,
매우 간단한 작업조차도 프로그래머가 손수 하나하나 직접 해줘야 합니다.

댓글 달기

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