C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[59902] Re: strlen()를 쓰는 것이 좋을 것 같습니다.
김민호.소중한꿈 [xho95] 1117 읽음    2010-01-22 12:28
size 결과가 4가 나오는 것은 포인터의 크기가 4 byte 이기 때문입니다.

'string' 변수의 타입은 'unsigned char *' 으로 하나의 포인터 입니다. 32bit 컴퓨터에서는 포인터 자체는 항상 4 bytes이니까, 일단, sizeof(string)은 4입니다.

그리고, string[0]의 타입은 unsigned char 형이므로 1byte입니다. 따라서 'sizeof(string)/sizeof(string[0])' 의 결과는 4가 될 수 밖에 없습니다.

12라는 값은 '포인터가 가리키는 대상의 개수'를 뜻하는 것인데, 이 값을 얻으려면 문자열 처음부터 NULL 종료 문자를 만날 때까지 개수를 헤아리면 됩니다. strlen() 같은 함수를 써도 될 것 같습니다. (최근의 String 같은 문자열 타입들은 문자의 개수를 따로 저장하는 것으로 압니다. 쓰기에 더 편하겠죠.)

어쨌든 결론은, 원하는 것은 '문자열 포인터가 가리키고 있는 대상의 개수'를 알고 싶은 것이지 '문자열 포인터 자체의 크기'를 알려고 하는 것은 아니라는 겁니다. 그러니까 타입의 크기를 알려고 하는데 쓰는 'sizeof' 연산자를 쓰는 것이 아니라, 문자열의 개수를 반환하는 'strlen' 같은 함수를 쓰는 것이 맞다고 봅니다.

김민조 님이 쓰신 글 :
: #include<stdio.h>
: #include<string.h>
:
: unsigned char str[]={"aaasdfsadfa"};
:
: void _printf(unsigned char *string)
: {
:     unsigned char size = sizeof(string)/sizeof(string[0]);
:     unsigned char Size = sizeof(str)/sizeof(str[0]);
:
:     printf("%s\n",string);
:
:     printf("%d\n",size);
:     printf("%d\n",Size);
: }
:
:
:
: int main()
: {
:     _printf(str);
:     return 0;
:    
: }
:
: 이걸 실행하면
: aaasdfsadfa
: 4
: 12
: 가 나오는데요
: size변수에 12가 되게 할 수 있는 방법은 없나요? 꼭 배열이름으로 sizeof연산을 해줘야만 값이 나오나요?

+ -

관련 글 리스트
59901 포인터 관련 질문 이요~ 김민조 936 2010/01/22
59902     Re: strlen()를 쓰는 것이 좋을 것 같습니다. 김민호.소중한꿈 1117 2010/01/22
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.