C 배열은 길이를 가지고 있지 않습니다.
컴파일 할때만 배열의 길이를 알고 실행시에는 아무런 정보가 없습니다.
따라서 저런 함수로는 알 수가 없습니다.
배열 길이는 보통 아래와 같은 매크로를 사용합니다.
#define ARRAY_LEN(X) (sizeof(X)/sizeof(X[0]))
이 사람이 큰일날 소리를...
배열의 길이를 구하는 것은 위에 어떤분이 적어주신 방법밖에 안됩니다.
#define ARRAY_LEN(X) (sizeof(X)/sizeof(X[0]))
* 참고로 X[0]는 (X)[0]로 고쳐야 됩니다.
sizeof를 이용한 것이므로 당연히 컴파일 할때만 배열의 크기를 알 수 있습니다.
게다가 인자로 주어지는 X의 타입이 반드시 array of ... 이어야만 합니다.
보통 배열은 array of ... 에서 pointer to ... 로 변하는 경향이 있으므로,
함부로 쓰다간 size of pointer/size of (*X)가 되어 된통 당하는 일이 있습니다.
> 컴파일 타임에 sizeof(...) 의 값은 상수로 정해지게 됩니다.
누가 아니라고 했나요?
저는 컴파일 타임에는 알 수 있지만 런타임에는 알 수 없다는 얘기가 틀리다고 한 겁니다.
이런 걸 "컴파일 타임에만 알 수 있다."라고 표현합니다. sizeof 안에 쓴 지정한 이름의 배열에 대해서만 값이 나오니까, 런타임에 임의의 배열에 대해서 실행할 수 없는 거죠. 위에 쓰신 ARRAY_LEN macro도 매크로의 인자가 컴파일 타임에 결정되어야 하고, 그거 하나에 대해서만 값을 알 수 있지 임의의 배열에 대해서 알 수 없죠. 예를 들어 ARRAY_LEN(flag ? array1 : array2) 이런 식으로 쓸 수 없습니다.
런타임에 알 수 있다는 건 예를 들면 함수로 임의의 배열 X를 던져줬을 때 이 배열 X의 크기를 함수 내에서 알 수 있는가? 이런 걸 런타임에 알 수 있다고 표현하는 겁니다.
따라서 sizeof의 계산은 런타임에만 수행되게 됩니다. (아마 sizeof(int) * (k + 3)이겠지요...) ISO/IEC 9898:1999에서 상수식(6.6 Constant expressions)으로 정의한 수식에서도 이러한 sizeof는 빠져 있습니다:
"6. An integer constant expression shall have integer type and shall only have operands that are integer constants, enumeration constants, character constants, sizeof expressions whose results are integer constants, and floating constants that are the immediate operands of casts. Cast operators in an integer constant expression shall only convert arithmetic types to integer types, except as part of an operand to the sizeof operator." (강조는 제가 했음)
하지만 이런 경우가 아닌 이상 sizeof의 계산은 컴파일 타임에 수행될 수도 있으며, 보통 그렇게들 합니다. (일반적인 경우 이 상황을 '컴파일 타임에 수행된다'라고 표현하죠?!)
C 배열은 길이를
C 배열은 길이를 가지고 있지 않습니다.
컴파일 할때만 배열의 길이를 알고 실행시에는 아무런 정보가 없습니다.
따라서 저런 함수로는 알 수가 없습니다.
배열 길이는 보통 아래와 같은 매크로를 사용합니다.
#define ARRAY_LEN(X) (sizeof(X)/sizeof(X[0]))
> C 배열은 길이를
> C 배열은 길이를 가지고 있지 않습니다.
> 컴파일 할때만 배열의 길이를 알고 실행시에는 아무런 정보가 없습니다.
무슨 말도 안되는 말씀을...
배열은 길이가 있고 실행시에도 길이를 알 수 있습니다.
구체적 방법이 알고 싶습니다.
설명 좀 해주세요... 편법으로라도 알아낼 수 있다면 나중에라도 좋겠는데요..
이 사람이 큰일날
이 사람이 큰일날 소리를...
배열의 길이를 구하는 것은 위에 어떤분이 적어주신 방법밖에 안됩니다.
#define ARRAY_LEN(X) (sizeof(X)/sizeof(X[0]))
* 참고로 X[0]는 (X)[0]로 고쳐야 됩니다.
sizeof를 이용한 것이므로 당연히 컴파일 할때만 배열의 크기를 알 수 있습니다.
게다가 인자로 주어지는 X의 타입이 반드시 array of ... 이어야만 합니다.
보통 배열은 array of ... 에서 pointer to ... 로 변하는 경향이 있으므로,
함부로 쓰다간 size of pointer/size of (*X)가 되어 된통 당하는 일이 있습니다.
배열의 길이는 프로그래머가 따로 관리를 해주는 것이 원칙적으로 맞습니다.
어떻게 발악해서
어떻게 발악해서 알아낸다면 알아낼 수야 있을지 모르겠지만... 호환성도 떨어지고 이래저래 문제가 많을 것 같습니다. 그리고 참고로 sizeof 는 함수가 아니라 매크로입니다. 컴파일 타임에 sizeof(...) 의 값은 상수로 정해지게 됩니다.
malloc 등의 소스를 참고한다면 (호환성은 떨어지겠지만) 동적으로 할당된 메모리에 대한 사이즈를 알아내는 것이 가능할 것 같지만 앞에서 얘기했듯이 malloc, free 등의 구현이 다 같지 않을테므로 호환성에 문제가 있을 것입니다.
다른 분들이 얘기하셨듯이 그냥 길이를 따로 저장하는 것이 맘도 편하고 호환성에도 문제가 없는 방법이 되지 않을까 합니다.
--
오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...
http://mytears.org ~(~_~)~
나 한줄기 바람처럼..
오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...
http://mytears.org ~(~_~)~
나 한줄기 바람처럼..
> 어떻게 발악해서
> 어떻게 발악해서 알아낸다면 알아낼 수야 있을지 모르겠지만... 호환성도 떨어지고 이래저래 문제가 많을 것 같습니다.
#define ARRAY_LEN(X) (sizeof(X)/sizeof(X[0]))
이것도 발악이라면 할 말 없구요.
void func(char* p)
{
ARRAY_LEN(p);
}
char p[10];
fund(p);
이런 걸 갖고 그러시는 모양인데 이건 당연히 안되죠.
왜냐하면 func 안에서 p는 배열이 아니라 포인터이기 때문입니다.
> 그리고 참고로 sizeof 는 함수가 아니라 매크로입니다.
전에도 이런 얘기 하시더만 아직도 그러시네요.
sizeof는 함수도 매크로도 아니고 연산자(operator)입니다.
C99 표준
6.5.3 Unary operators
6.5.3.4 The sizeof operator
> 컴파일 타임에 sizeof(...) 의 값은 상수로 정해지게 됩니다.
누가 아니라고 했나요?
저는 컴파일 타임에는 알 수 있지만 런타임에는 알 수 없다는 얘기가 틀리다고 한 겁니다.
"런타임에 알 수 있다"의 개념이 잘못 잡히신 듯.
이런 걸 "컴파일 타임에만 알 수 있다."라고 표현합니다. sizeof 안에 쓴 지정한 이름의 배열에 대해서만 값이 나오니까, 런타임에 임의의 배열에 대해서 실행할 수 없는 거죠. 위에 쓰신 ARRAY_LEN macro도 매크로의 인자가 컴파일 타임에 결정되어야 하고, 그거 하나에 대해서만 값을 알 수 있지 임의의 배열에 대해서 알 수 없죠. 예를 들어 ARRAY_LEN(flag ? array1 : array2) 이런 식으로 쓸 수 없습니다.
런타임에 알 수 있다는 건 예를 들면 함수로 임의의 배열 X를 던져줬을 때 이 배열 X의 크기를 함수 내에서 알 수 있는가? 이런 걸 런타임에 알 수 있다고 표현하는 겁니다.
"컴파일타임에 알 수 있다"의 개념이 잘못 잡히신 듯.
> 이런 걸 "컴파일 타임에만 알 수 있다."라고 표현합니다.
이런 걸 "컴파일 타임에도 알 수 있다."라고 표현합니다.
>런타임에 알 수 있다는 건 예를 들면 함수로 임의의 배열 X를 던져줬을 때 이 배열 X의 크기를 함수 내에서 알 수 있는가? 이런 걸 런타임에 알 수 있다고 표현하는 겁니다.
이런 걸 런타임에만 알 수 있다고 표현하는 겁니다.
ARRAY_LEN(1 ? array1 :
ARRAY_LEN(1 ? array1 : array2)
이건 컴파일 타임에 매크로의 인자가 결정되는데 안되는지 되는지좀 설명해 주십시오 jick님.
다른 분들은 끼어들지 말고 jick님만 설명해 주십시오.
안됩니다.
자세한 설명은 생략한다. - 김성모.
런타임에 된다고 주장하고 싶으면 런타임에 되는 예제를 들고와야죠. 컴파일타임에 안되는 예제를 들고오면 뭐합니까? 쯧.
왜 안되는지 설명을
왜 안되는지 설명을 해보시라니까요?
컴파일 해보고 된다 안된다 말하는건 원숭이도 할 수 있습니다.
전 원숭이가 아니거든요.
원숭이는 컴파일해보라고 하면 신나서 잘 합니다. (뭐, 최소한 컴파일을 해보고 된다 안된다 말할 수 있는 수준의 원숭이라면 그렇겠죠.)
근데 사람은 좀 더 똑똑해서 뭔가 떡고물이 떨어지지 않으면 잘 움직이지 않죠. 설명해 드릴 용의는 있는데, 일단 계좌번호 불러드릴까요? 얼마 주실라우?
* 자 과연 몇 point나 깎일 것인가!
sizeof가 항상 컴파일
sizeof가 항상 컴파일 타임에 결정되는 '상수'인 것은 아닙니다. 한 가지 예를 들면...
따라서 sizeof의 계산은 런타임에만 수행되게 됩니다. (아마 sizeof(int) * (k + 3)이겠지요...) ISO/IEC 9898:1999에서 상수식(6.6 Constant expressions)으로 정의한 수식에서도 이러한 sizeof는 빠져 있습니다:
"6. An integer constant expression shall have integer type and shall only have operands that are integer constants, enumeration constants, character constants, sizeof expressions whose results are integer constants, and floating constants that are the immediate operands of casts. Cast operators in an integer constant expression shall only convert arithmetic types to integer types, except as part of an operand to the sizeof operator." (강조는 제가 했음)
하지만 이런 경우가 아닌 이상 sizeof의 계산은 컴파일 타임에 수행될 수도 있으며, 보통 그렇게들 합니다. (일반적인 경우 이 상황을 '컴파일 타임에 수행된다'라고 표현하죠?!)
네. 감사합니다.
네. 감사합니다.
========================
조직 : E.L.D(Embedded Linux Developer/Designer)
블로그 : poplinux@tistory.com
카페 : cafe.naver.com/poplinux
임베디드 리눅스 관련 프리렌서 지향
size() 함수 안에서는
size() 함수 안에서는 인자로 받은 배열의 사이즈를 알아낼 방법이 없습니다. 보통 배열을 인자로 받는 함수의 경우에는 두번째 인자로 해당 배열의 사이즈를 넘겨받도록 만듭니다. 자세한 내용은 아래 페이지를 읽어보세요.
http://cinsk.org/cfaqs/html/node8.html#6.21
======================
BLOG : http://superkkt.com
======================
BLOG : http://superkkt.com
삽질의 대마왕...
대표적으로 array size 를 따로 변수에 정해서 유지해야 하는 예제가 되겠네요.
삽질의 대마왕...
삽질의 대마왕...
arr 사이즈가 10이라서
arr 사이즈가 10이라서 10이라고 출력하는데 뭐가 이상합니까?
혹시 님이 생각하시는건 이거 아닙니까?
char *arr[] = { "Hello", "World", }; // prefixed array size
printf("I hope this is 2: %d\n", sizeof(arr)/sizeof(arr[0]));
댓글 달기