문자열을 받아올때 여러가지를 해봤는데요...

PETCH의 이미지

처음으로 글을 올리네요.

배우긴 배웠지만 여러 가지 하다 보면 아주 기본적인 것들이 이해가 안 가고 그렇다 보니 실제 필요한 프로그램을 짤 때는 문제가 많이 생기네요... 고수님들 부탁드립니다..

#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
void main()
{
	int ch[] = { 'abcd','13' };
	printf("%s,%d", ch,sizeof(ch));
 
}

위와 같이 했을 때 문제가 생기는 것이 당현한것을 알지만, 솔직히 어째서 오류가 뜨는지 이해가 안 가네요.

일단 int형 자료는 4byte니 문자가 4개까지 문자가 들어갈 수 있지 않나요? 문자는 8bit를 쓰니까요.

그래서 위와 같이 짰을 때 문자 문자가 4개가 초과하게 초기화했을 때 빨간 줄이 생긴다고 이해를 했습니다.

그렇다면 실행했을 때 abcd13 그리고 크기는 8바이트가 출력돼야 한다고 생각했습니다. 그런데 희안하게 문자가 각각 거꾸로 출력되더군요.

dcba31,8

이렇게 출력이 됩니다. 어째서 char형만 문자 배열이 정상적으로 출력되고 int형은 출력이 제대로 되지 않는지 궁금합니다. 그리고 왜 거꾸로 출력되는 건가요?

PETCH의 이미지

위에 중복된 글들 지우고 싶은데 어떻게 해야 하나요

pchero의 이미지

재미있는 예제네요.

답은 간단합니다. 그렇게 쓰면 안되기 때문입니다.

하나씩 풀어보자면 다음과 같습니다.

	int ch[] = { 'abcd','13' };
	printf("%s,%d", ch,sizeof(ch));

먼저 ch 는 int 타입의 데이터를 저장하는 배열 입니다. 왜냐하면 그렇게 선언을 했으니까요. "int ch[]"
그 다음, 초기 값으로 {'abcd', '13'} 를 지정했습니다.
그런데, 여기서 문제가 생깁니다. 왜냐하면 타입이 다르니까요.

'abcd' 는 1byte 짜리 char 타입 데이터 입니다. 1byte char 타입 4개짜리 문자열이 아니에요.
따옴표(' ')로 쳐진 부분은 하나의 char 데이터로 입력됩니다. 그 길이가 얼마이던지요. 문자열을 입력하고자 한다면 쌍따옴표(" ")를 쓰셔야 해요.

그리고 뒤쪽에 나오는 '13' 역시 1byte 짜리 char 데이터 입니다. 이유는 위와 같습니다.

위에 나열한 이유로, 초기값으로 입력하고자 하는 데이터는 1 byte 짜리 char 데이터 2개 라는 결과가 나옵니다.
그런데 이걸 int 배열에 넣게됩니다.

1 byte 짜리 데이터 2개가 각각 4byte 짜리 int 타입에 들어가게 됩니다.
이렇게 만들어진 것이 int 데이터 2개짜리 배열입니다.
그런데 문제는 어떤 데이터가 들어가게 되는지 알 수 없다는 점입니다.

여기부터 문제가 시작됩니다. 서로 다른 타입의 데이터가 알 수 없는 방식으로 입력되었습니다.
게다가 출력 방식도 잘못되었구요. int 타입의 데이터를 문자열 방식으로 출력하고 있습니다.

출력되기는 하지만 뭔가 잘못된 값이 나옵니다.

이유는 잘못된 데이터 값을 넣었고, 잘못된 방식으로 이를 출력했기 때문입니다.

결론은.... 그냥 잘못된 사용법에 의한 잘못된 결과 입니다.
위와 같은 현상에 대해 궁금함을 가질 수는 있지만, 나타나는 결과에 대해서 분석을 하실 필요는 없습니다.
그냥 잘못된 오류 값이 나타나는 거에요.
그 오류값이 왜 그렇게 나타나는 지를 분석하고자 하신다면 이는 말씀드렸다시피, 컴파일러를 분석하셔야 합니다. 컴파일러에서 각각의 데이터 타입에 대해서 어떻게 메모리를 할당하고 접근하는지에 대한 문제에요.

---------------------------------
제일 왼쪽이 저입니다 :)

PETCH의 이미지

먼저 답변에 감사드립니다.
그렇다면 결국 1bype 용량안에 문자열'abcd'가 모두 저장 될 수 있는 건가요?

pchero의 이미지

아니요. 문자열 'abcd'가 저장되는게 아닙니다.
정확히는 1 byte 크기의 "알수없는 데이터"가 들어가게 됩니다.

1 byte 에 문자열 'abcd'가 저장될 수는 없죠.
데이터가 잘리거나 잘못된 데이터가 입력되는 등의 문제가 생깁니다.
데이터 적인 오류가 발생하는데, 정확히 어떤식으로 오류가 발생되고 암묵적으로 처리되는지는 모르겠네요.
이 부분을 모르니 "알수없는 데이터"가 되는 겁니다.

아무튼 간단한 예로, int 타입에 3.14 와 같은 소수점이 있는 숫자 데이터를 넣게 되면 자연수 3만 저장되는 것과 같은 방식입니다.

---------------------------------
제일 왼쪽이 저입니다 :)

PETCH의 이미지

앞으로 배울게 많네요 친절한 답변 감사드립니다.

peecky의 이미지

CPU의 엔디안이랑 사용한 컴파일러에 따라 결과가 달라질 수 있습니다.

컴파일 에러가 안 뜨신 걸 보니 multi byte character를 지원하는 컴파일러를 쓰신 것 같습니다.

'abcd'는 0x61626364 값이 되고 리틀엔디안 시스템의 경우 0x64부터 ch[0]의 첫 부분에 저장됩니다.
'13’은 0x00003133이 되고 0x33값부터 ch[1]의 첫 부분에 저장됩니다.
(왜 저런 값이 되는지는 ASCII 테이블을 참고해보세요)

printf의 %s는 첫 바이트부터 시작해서 NULL character를 만날 때 까지 문자를 출력합니다. 첫 바이트에 'd'가 저장되어 있으므로 저런 결과가 나오게 됩니다. 그리고 다행히(?)도 ch[1]에 0 값이 있어서 이걸 NULL character로 인식해서 "dcba31"까지만 출력되었는데, 0이 없었으면 이상한 값이 출력되거나 프로그램이 죽었을 겁니다.

PETCH의 이미지

그렇군요. 저렇게보니 더 잘 이해가 가네요. 감사합니다.
메모리에 push 되고 넣은 순서대로 끄집어내지는 것이 아니라 위에서부터 끄집어낸다는 것을 어디서 본 것 같은데 그런 원리인 건가요?

peecky의 이미지

Stack을 말씀하시는 것 같은데, 그것이랑은 관련 없습니다.
a, b, c, d 순서대로 저장되는 게 아니라, 'abcd'가 한 덩어리로 한 번에 저장됩니다.

PETCH의 이미지

친절한 답변 감사드립니다. 엔디안에 대해 한번 공부해 봐야겠네요.

HDNua의 이미지

답글 달아 남겨놔야겠습니다.

저는 이렇게 생각했습니다.

댓글 달기

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