포인터 이해(3)

rgbi3307의 이미지

#include

int main (void)
{
char *a;
int *b;
float *c;
double *d;

printf ("a=%d, b=%d, c=%d, d=%d\n", sizeof(*a), sizeof(*b), sizeof(*c), sizeof(*d));

return 0;
}

printf() 함수의 출력은 어떻게 될까요?

From:
*알지비 (메신저: rgbi3307(at)nate.com)
*학창시절 마이크로마우스를 만들었고, 10년동안 IT관련 개발자로 일하고 있음.
*틈틈히 커널연구회(http://www.kernel.kr/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))

Fe.head의 이미지

아마도.. 1, 4, 4, 8

컴파일러에 따라 다를지도 모르겠네요.

뻑이 날수도.
-----------------------
과거를 알고 싶거든 오늘의 네 모습을 보아라. 그것이 과거의 너니라.
그리고 내일을 알고 싶으냐? 그러면 오늘의 너를 보아라. 그것이 바로 미래의 너니라.
-----------------------
내가 쓰는 글은 틀릴 수 있습니다.

고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"

semmal의 이미지

http://kldp.org/node/69578

를 참고하는 것이 좋겠네요.
------------------------------
How many legs does a dog have?

------------------------------
How many legs does a dog have?

rgbi3307의 이미지

*는 포인터(주소)안의 데이터를 참조하므로

그 크기는 1, 4, 4, 8 입니다.

From:
*알지비 (메신저: rgbi3307(at)nate.com)
*학창시절 마이크로마우스를 만들었고, 10년동안 IT관련 개발자로 일하고 있음.
*틈틈히 커널연구회(http://www.kernel.kr/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))

From:
*알지비 (메일: rgbi3307(at)nate.com)
*커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))

semmal의 이미지

그렇게 단언적으로 말하시면 곤란합니다.

아시리라 믿지만 C언어에서 모든 타입의 크기를 보장하지는 않습니다.

이 글을 보는 분들이 PC만 만진다면 별로 상관은 없을 수 있는데, 아니라면 이렇게 알고있는게 치명적인 실수가 될 수도 있거든요.
------------------------------
How many legs does a dog have?

------------------------------
How many legs does a dog have?

rgbi3307의 이미지

있습니다.

20세기초(1920~1940) 트랜지스터가 발명됩니다.
이놈이 하는 역할이 두가지 인데,
하나는 전류를 증폭(입력보다 출력을 크게)하는 것이고,
다른 하나는 전류를 On/Off(스위치)하는 것입니다.
사람이 수작업으로 스위치 조작하던것을 전기를 통하여 자동으로 하니.. 획기적인 것이었죠.

오늘날 디지털기기는 트랜지스터의 On/Off의 기능을 응용한 것이고,
수많은 디지털기기가 나옵니다.

스위치를 수로 표현하면 1,0(2진수)이고,
디지털 논리회로는 2진수의 나열입니다.
1과0을 4개로 조합하면 4비트가 되고, 8개로 조합하면 8비트가 되고, 16개로 조합하면 16비트가 되고...

그런데, 1980년대까지 표준안 이라는게 없었습니다.
누구는 문자를 4비트로 표현하고, 5비트로 표현하고, 7비트로 표현하고.. 했겠죠.
미국의 IEEE(전기전자기술자협의회)에서 표준안을 만들기 시작합니다.
그중에서 리차드스톨만 이라는 사람이 POSIX(Portable Operating System Interface)를 설립하고,
POSIX 1988, 1990, 1993, 2001, 2004... 만듭니다.
아참, 그전에 1978년에 Dennis Ritchie 와 Brian Kernighan이 K&R C언어를 만들고,
ANSI C, ISO C... 등으로 표준안을 만듭니다.(마이크로소프트는 이것을 상업적으로 잘~ 활용했구요.)

서두가 길었습니다만, 제가 지금까지 경험한 위의 표준안들에서,
데이터의 크기는(주소 말고... 주소는 아키텍쳐에 의존)
딱~ 정해지더군요.
그려야 표준적인 문자로 정보교환 할 수 있으니까요~

From:
*알지비 (메신저: rgbi3307(at)nate.com)
*학창시절 마이크로마우스를 만들었고, 10년동안 IT관련 개발자로 일하고 있음.
*틈틈히 커널연구회(http://www.kernel.kr/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))

From:
*알지비 (메일: rgbi3307(at)nate.com)
*커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))

semmal의 이미지

ISO든 ANSI든 C표준은 char와 int형에 대해서 표현하는 범위를 정하고 있을 뿐 정확한 비트수를 정하고 있지 않습니다. sizeof(char)==sizeof(int)를 만족하는 기계에서 프로그래밍을 안해보셨군요. 오래전 기억이기는 하지만 TI사에서 제공하는, 기억이 안나는 어떤 모델의 개발킷에서는 그랬었습니다.
------------------------------
How many legs does a dog have?

------------------------------
How many legs does a dog have?

segfault의 이미지

http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf

6.2.5. Types

5. An object declared as type signed char occupies the same amount of storage as a
‘‘plain’’ char object. A ‘‘plain’’ int object has the natural size suggested by the
architecture of the execution environment
(large enough to contain any value in the range
INT_MIN to INT_MAX as defined in the header ).

한 마디로 아키텍쳐에 따라서 자료형의 범위는 달라질 수도 있습니다.

----
http://www.planetmono.org

klyx의 이미지

각 타입이 전부 정해져있지 않습니다.
sizeof(char)가 1이라는 것만이 보장되어있고, 이것만 보장되어있으면 말씀하신 데이터 교환에는 문제가 없지요.

rgbi3307의 이미지

1바이트로 정해진다는 것인가요?(보장되어 있다라는 의미가?)
왜? char형은 1바이트로 정해지는(보장) 가요?
그럼, int, float, double은 어떻게 처리되는 가요?

From:
*알지비 (메신저: rgbi3307(at)nate.com)
*학창시절 마이크로마우스를 만들었고, 10년동안 IT관련 개발자로 일하고 있음.
*틈틈히 커널연구회(http://www.kernel.kr/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))

From:
*알지비 (메일: rgbi3307(at)nate.com)
*커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))

klyx의 이미지

전 '보장되어있다', 혹은 '정해져있다' 라는 것은 '표준에 의해서'라고 생각하고 있었습니다만, rgbi3307님께서는 다른 것을 생각하고 계셨나요...?
마찬가지로 int, float, double등은 '표준에 의해서' 정해져있지 않습니다.

rgbi3307의 이미지

어떤 표준안이지 알려 주시면 고맙겠습니다.
제가 표준안을 다 알고 있지 못합니다.
위의 내용이 언급되어 있는 표준안이 궁금해 져서요.

From:
*알지비 (메신저: rgbi3307(at)nate.com)
*학창시절 마이크로마우스를 만들었고, 10년동안 IT관련 개발자로 일하고 있음.
*틈틈히 커널연구회(http://www.kernel.kr/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))

From:
*알지비 (메일: rgbi3307(at)nate.com)
*커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))

klyx의 이미지

표준'안'이 아니라 확정된 표준입니다. sizeof대한 것은 C89때부터 이미 정해져있습니다.
구체적인 표준 문서는 구입하지 않으면 찾기 어렵기 때문에, 제가 직접 인용하긴 어렵습니다만, 인터넷에서 찾아보시면 관련 내용도 많고, 표준을 인용한 글도 볼수 있을 것입니다.
http://en.wikibooks.org/wiki/C_Programming/Reference_Tables#Table_of_Data_Types
이쪽을 보시면 최소한 표준에 의해 보장된 내용들이 나와있습니다.

아, 댓글중에 문서링크가 있네요.
그안에서 찾아보면, sizeof(char)가 1이라는 것은 6.5.3.4 에 나와있습니다.

Quote:
When applied to an operand that has type char, unsigned char, or signed char,
(or a qualified version thereof) the result is 1.

또, sizeof()의 결과 값에 대해서는
Quote:
The value of the result is implementation-defined, ...
라고 적혀있습니다.
rgbi3307의 이미지

segfault님이 언급하신 문서를 자세히 보지 않았습니다.
제가 궁금했던 부분을 다시한번 확인해 봤습니다.

참조:
http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf

6.2.6 Representations of types

6.2.6.1 General

1. The representations of all types are unspecified except as stated in this subclause.
1. 이 하위조항에 언급된 것을 제외하고, 모든 타입들의 표현은 지정되지 않는다.
(아래 하위조항에서 모든 타입들의 표현이 지정된다)

2. Except for bit-fields, objects are composed of contiguous sequences of one or more bytes,
the number, order, and encoding of which are either explicitly specified or
implementation-defined.
2. 비트-필드들을 제외하고, 객체들(objects; 역자주 types)은 하나 혹은 그이상의 바이트들의
연속된 순서들로 구성되며, 숫자, 순서(order), 이것의 인코딩은 명시적으로 지정 혹은 구현-정의된다.

3. Values stored in unsigned bit-fields and objects of type unsigned char shall be
represented using a pure binary notation.40)
3. unsigned bit-field들과 unsigned char 타입의 객체들에 저장된 값들은
순수 이진법을 사용하여 표현된다. (별첨40참조)

4. Values stored in non-bit-field objects of any other object type consist of n x CHAR_BIT
bits, where n is the size of an object of that type, in bytes. 이하 생략...
4. 값들은 n x CHAR_BIT의 객체 타입으로 구성된 non-bit-field 객체들에 저장되고,
여기서 n은 바이트로 주어진 그 타입의 객체 크기이다. 이하 생략...

결론은...

데이터 타입의 크기 == n x CHAR_BIT == 자연수 x 바이트

혹, 제가 잘못 번역전달하는 부분이 있다면 지적해 주시길...
(에고~ 천추태후 할 시간이네요. 보고 자야 겠네요. 쯥~)

From:
*알지비 (메신저: rgbi3307(at)nate.com)
*학창시절 마이크로마우스를 만들었고, 10년동안 IT관련 개발자로 일하고 있음.
*틈틈히 커널연구회(http://www.kernel.kr/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))

From:
*알지비 (메일: rgbi3307(at)nate.com)
*커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))

select99의 이미지

옛날 터보C 로 컴하일해보면.. int 2 로나올겁니다.

그리고 ILP64머신 에서는.. 8 바이트죠..

phonon의 이미지

표준안에 정해져 있던 아닌던 간에 de facto(실질적 표준)이 없으면 어떻게 개발을 하겠습니까.
그런 애매한 것을 제시할수록 C라는 언어를 어렵다고 생각하게 하는 겁니다.
모든 것은 묵시적 약속에 의해서 우리는 컴퓨터와 의사소통을 하고 있지 않나요.

gardner의 이미지

님한테는 특이한 경우지만 남한테는 일반적인 경우죠.
님이라는 글자에~ 점하나를 찍으면~
special이 general이 되는 장난같은 인생사~

de facto를 자기 기준에 따라 멋대로 정의하지 말아 주세요

님이 말하는 실질적 표준이란 대체 뭡니까? 윈도XP? 리눅스? 인텔CPU?

솔까말 C가 하루 이틀 쓰인 것도 아닌데,
지금 널리쓰이는 컴퓨터에 C를 맞추라는게
시간적으로 볼때 더 이상한 주문 아닌가요?
C가 만들어질 때도 int가 32비트 였을꺼 같아요?

klyx의 이미지

'그냥 보통 int는 4바이튼데 뭘 그리 따지냐'고 하시는 거 같은데, 그 이야기를 하는 사람은 그 전에 '표준에 정해져 있지는 않지만, 일반적으로는 4바이트이다'라는 것을 알고있어야만 합니다.
묵시적 약속이 뭔진 모르겠습니다만, 그런게 있다면, '묵시적으로 적용되어있다'는 것을 알고 써야지, 그렇지도 않으면서 무조건 그것을 진실로 인식하는 것은 위험합니다.

게다가 rgbi3307님께서는

Quote:
제가 지금까지 경험한 위의 표준안들에서,
데이터의 크기는(주소 말고... 주소는 아키텍쳐에 의존)
딱~ 정해지더군요.
라고 하셨고, 이것은 명백하게 '거짓'이기 때문에 지적하고 있는 것입니다.
rgbi3307의 이미지

"딱~ 정해지더군요"
이것을 '거짓'이라고 지적하는 것에 대해서 인정할 수 없습니다.

다만, 예를들어, int형은 아키텍쳐에 따라, 1바이트, 2바이트, 4바이트... 등이 될 수 있는데,
"딱~ 정해진다"라기 보다, "바이트의 정수배"로 정해진다라는 표현이 맞다고 지적해 주십시요!

From:
*알지비 (메신저: rgbi3307(at)nate.com)
*학창시절 마이크로마우스를 만들었고, 10년동안 IT관련 개발자로 일하고 있음.
*틈틈히 커널연구회(http://www.kernel.kr/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))

From:
*알지비 (메일: rgbi3307(at)nate.com)
*커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))

semmal의 이미지

궁금한게 있는데... C99는 한 번이라도 읽으시고 댓글을 다시는 겁니까?
------------------------------
How many legs does a dog have?

------------------------------
How many legs does a dog have?

lifthrasiir의 이미지

http://en.wikipedia.org/wiki/Word_(computing) 에서:

"Modern computers usually have a word size of 16, 32, or 64 bits. Many other sizes have been used in the past, including 8, 9, 12, 18, 24, 36, 39, 40, 48, and 60 bits."

int의 크기가 보통 워드 크기로 정해진다고들 하죠?

소타의 이미지

요즘은 맥OS에서 개발하고 32비트, 64비트 리눅스에서도 동일한 동작을 보장해야 하고 데이터 파일이 호환도 되야하는 프로그램을 C로 만들고 있습니다.
그리고 각 서버간의 통신도 하는데 클라이언트가 32비트일 수도 있고 64비트일 수도 있고 그렇습니다.
이런 상황에서는 그런 de facto는 전혀 도움이 안됩니다. 이 정도의 신뢰성 있는 OS 플랫폼이면 표준을 "어기지는 않았을 것"이다 라는 사실만을 신뢰하고 코딩해야 합니다.

묵시적인 약속과 실질적 표준도 다른 얘기죠.

hongwoo의 이미지

생각해보니.. 병특하려고 처음 면접본 회사에서 내준 문제랑 비슷하네요.
2002년 봄이었습니다.
그때는 compiler 마다 다릅니다~ 라고 자랑스럽게 대답했었더랬지요.

테스트해봤습니다.

CPU : Intel Xeon
OS : XP
Compiler : Turbo C 2.0

a=1, b=2, c=4, d=8

-----------------------------
in the real-time scheduler !

-----------------------------
in the real-time scheduler !

lysgenius의 이미지

C를 공부하고 있는 저로썬...
포인터의 이해이니 그냥 가면 될듯한데요.^^ 아니면 그냥 값만 요구하는것 보단 그 과정을 요구하면 이러저러한 말도 없을듯하고요.
athlon 64 / Visual C++ 2008 EE(Express Edition) / Windows XP 32bit SP3 에서 cpp 확장자로 해보니깐 1448이 나오네요..