sizeof에 대한 설명인데 무슨 말인지 이해가 잘 안갑니다. 도와주세요.
글쓴이: inviolable / 작성시간: 토, 2012/10/27 - 10:26오후
책 253p에 "strlen은 실행시점에서 작용하는 함수인 반면, sizeof은 버퍼의 길이를 컴파일 시점에서 계산한다. 이 경우 버퍼는 문자열 리터럴로 초기화되기 때문에 크기가 컴파일 시점에서 고정된다." 라는 설명이 이해가 잘 안갑니다.
그럼 sizeof함수를 사용하면 크기를 계산한 버퍼(char*형)는 char buffer[] = "Hello"; 문자열로 초기화준 것처럼 똑같은 효과를 갖게되고, 실행 시점에서 그 버퍼를 수정해서 크기를 변경할 수 없다는 말인가요???
Forums:
gilgil.net
sizeof는 함수가 아닙니다. 말 그대로 preprocessor입니다.
www.gilgil.net
preprocessor가 아니고 연산자...
...인데요. 깜박 실수하신듯. :)
gilgil.net
헉, 연산자이군요.
compile time에 결정된다라고 하여
제가 잘못 알고 있었습니다. ^^
www.gilgil.net
아... 맞아 연산자였죠???
헤깔렸습니다.ㅎㅎ
버퍼와 포인터를 통해 이해를 하면?
char[] 배열은 컴파일 시점(코드를 작성하는 시점?)에 임의의 크기를 정해서 사용하고,
char* 배열의 경우 "문자열"과 같은 문자열을 대입하였다가 다른 문자열을 대입할 수도 있지만,
sizeof를 사용하면 포인터의 크기가 나온다?
예제를 작성해 보겠습니다.
이 코드에서는 chararray가 초기 값을 가지지 않으니 에러가 발생합니다. ( 즉, 배열은 선언시 크기가 결정되어야 하나 봅니다. )
결과는 아래와 같습니다.
charpointer의 크기는 8이 나옵니다. 문자열의 크기가 아닌 포인터의 크기가 나왔습니다?
chararray의 경우는 c에서 문자열의 마지막에는 null?이 들어가기 때문에 배열의 크기는 문자의 갯수+1로 6이 나왔습니다.
다음으로는 문자열 배열에 값을 변경해보겠습니다.
결과는 에러입니다.
문자열이란 특성 때문에 문제가 되는 것 같은데, sizeof는 변수 자체의 크기(컴파일타임 혹은 코딩시점?)를 나타내며, c에서는 배열의 크기가 변경될 수 없는 것으로 보입니다.
----
char[] 형의 경우는 컴파일(코딩?) 시점에 크기가 정해지며, sizeof 함수를 통해서 배열의 크기를 확인할 수 있다.
char* 형의 경우 sizeof 함수의 결과는 문자열의 크기가 아닌 포인터(메모리 번지?)의 크기가 나올 것이다? ( 맞나요? )
char[] 형의 경우, 크기를 변경할 수 없다? ( 맞나요? )
문자열의 경우는 c에서 sizeof 연산자(?)를 통해서 문자열의 길이를 측정하면 안된다.
그렇군요... 답변 감사합니다.
sizeof은 배열의 경우 배열의 크기(바이트 수)를 계산해주고 이는 초기화한 후에는 변경할 수 없다 라는 말이군요... 답변 감사합니다.
sizeof() 연산자는 해당 코드가 실행될 호스트
sizeof() 연산자는 해당 코드가 실행될 호스트 머신의 타입시스템을 참고해서 그 값이 컴파일 중에 결정됩니다.
()안에 들어갈 수 있는 것은 상수, 변수, 데이타 타입 등등인데 sizeof() 연산자는 각각이 메모리에서 얼마만한 크기를 할당받게 되는지를 알려줍니다.
strlen() 는 함수입니다. 기능은 () 안에 있는 주소값으로부터 널을 만날 때까지 연속된 메모리 공간의 크기를 계산합니다. 그것이 스트링의 길이가 됩니다.
char pBuff[] = "Hello World";
이렇게 선언하면 pBuff 는 배열의 시작 주소를 가집니다. 그 배열은 "Hello World" 라는 스트링을 담을 수 있는 크기로 초기화가 됩니다.
배열은 크기가 변경되지 않으므로 sizeof(pBuff) 로 그 크기를 구해보면 언제나 12 입니다.
strlen(pBuff) 는 11입니다. (널 문자는 스트링 길이에 포함 안음)
*(pBuff +4) = 0x0;
하고나면, strlen(pBuff) 는 더이상 11이 아니게 됩니다.
*(pBuff +4) = 0x0;
하고나니, strlen(pBuff) 는 더이상 11이 아니게 됩니다.
하지만 sizeof(pBuff) 는 컴파일 시 계산했던 배열의 크기 12 를 변경되지 않은 값으로 돌려줍니다.
sizeof() 가 사용되면 같은 코드라도 컴파일된 코드가 실행될 시스템의 타입 시스템에 따라 그 결과가 상이할 수 있다는 걸 알아야 합니다.
http://www.winapi.co.kr/clec/cpp1/5-3-3.htm
Thanks for being one of those who care for people and mankind.
I'd like to be one of those as well.
흠...확실히 이해가 갔습니다.
친절한 설명에 코딩까지 정말 감사합니다...(__)
댓글 달기