2012-02-10 2 views
3
static int a[] = {1, 5, 645, 43, 4, 65, 5408, 4, 7, 90, 23, 11}; 
int len=sizeof(a)/sizeof(int); 

ANSI 99와 함께 바로 가기가 있습니까?이 C 코드보다 배열의 길이를 찾는 더 짧은 방법이 있습니까?

+1

좋은 질문입니다. 나는 C- 안에있는 것 같다. – mikithskegg

+1

(VLA 제외)'sizeof arr/sizeof * arr'은 컴파일 타임 상수입니다. 왜 다른 방식을 원하니? 매크로 * – pmg

+3

'int len ​​= 12'을 시도해보십시오. ;) – Nim

답변

5

나는 바로 가기가 아니라고 생각하지만, 고양이 사용하는 매크로 :

#define arrlen(arr) (sizeof(arr)/sizeof(arr[0])) 
+2

+1,하지만 대문자로 작성하여 매크로임을 분명히 할 수 있습니다. –

1

이 C 코드보다 배열의 길이를 찾을 수있는 짧은 방법이 있나요?

예, 하나 개의 문자 짧은 :

static int a[] = {1, 5, 645, 43, 4, 65, 5408, 4, 7, 90, 23, 11}; 
int len=sizeof a/sizeof(int); 

편집 : @pmg 제안 더 짧은 버전이있다 :

static int a[] = {1, 5, 645, 43, 4, 65, 5408, 4, 7, 90, 23, 11}; 
int len=sizeof a/sizeof*a; 

또한 식별자 len 더 적은 문자를 사용할 수 있습니다 .

:

+1

hehe :'sizeof a/sizeof * a' : 3 자 미만의 버전입니다. – pmg

+0

@pmg : 나는 포기한다. 네가 이겼다. :) – NPE

+0

대기 - 쇼?!? OK 나는 더 공부해야 해! 감사! – Coffee

1

당신이 원하는 경우

sizeof arr/sizeof *arr 

또는

sizeof arr/sizeof arr[0] 

그것이수록 짧은에 대한 있습니다 요소 배열의의 수. arr이 VLA가 아니면 컴파일 시간에 계산됩니다.

또한 arr어레이 표현 인 경우 포인터가 아닌 경우에만 작동한다는 점도 기억하십시오. 당신이

void foo(int arr[]) 
{ 
    size_t len = sizeof arr/sizeof *arr; 
    ... 
} 

뭔가를 할 경우 이러한 맥락에서 arr포인터 표현하지 배열 (온라인 C language standard을 참조하기 때문에 당신은, 당신이 기대하는 답을받지 않습니다 § 6.3.2.1 ¶ 3 및 § 6.5.7.3 ¶ 7).

관련 문제