2016-07-06 2 views
-1
char a[255]; 
void test(char* a){ 
    printf("%d %d %d \n",sizeof(a),sizeof(*a),sizeof(&a)); 
} 

이들 모두는 변수 'a'의 실제 크기를 얻지 못합니다.함수 (언어 c)에서 char 배열 크기를 얻으려면 어떻게해야합니까?

+1

다른 함수로 전달할 때 배열에 포인터가 없어 질 수 없습니다. 선언의 범위 내에서만 크기를 얻을 수 있습니다 (전역 배열의 경우 함수 범위, 전역 배열의 경우 파일 범위). –

+0

strlen (a); 문자열의 크기를 반환하지만 전체 배열은 반환하지 않습니다. –

+0

[sizeof '(배열을 가리키는 포인터)를 찾는 방법] (http://stackoverflow.com/questions/492384/how-to-find)을 참조하십시오. - sizeofa-pointer-pointing-to-an-array). – Lundin

답변

3

수 없습니다. 크기를 추가 매개 변수로 전달해야합니다. 아마도 크기가 음수 일 수 없기 때문에 아마도 unsigned int 유형 일 것입니다. 이 같은 최종 결과는 비록 그 대회이기 때문에

void test(char* a, unsigned int size) 
{ 
    // ... 
} 

, 두 번째 인수 size_t를 만들기 위해 더 나은 것입니다.

void test(char* a, size_t size) 
{ 
    // ... 
} 
+4

또는'size_t'는 객체 시퀀스의 크기를 설명하기 위해 표준 라이브러리 전체에서 꽤 많이 사용되었습니다. – WhozCraig

+0

@WhozCraig 잘 부탁드립니다. – nvoigt

3

첫 번째 요소에 대한 포인터와 함께 명시 적으로 전달해야합니다.

char a[255]; 
void test(char* a, size_t num_elem){ 
    /* do smth */ 
} 

int main() { 
    test(a, sizeof a/sizeof a[0]); 
    return 0; 
} 

그리고 sizeof a/sizeof a[0] 당신에게 배열 내 요소의 수를 제공,이 트릭 포인터 만 배열 제대로 작동하지 않습니다.

+0

'sizeof a [size] a [0]'트릭은'main' 함수에서만 작동합니다. 'a'는 배열 타입이고'test'에서는 작동하지 않습니다. 왜냐하면' a'는 포인터 타입의 매개 변수 'a'에 의해 음영 처리됩니다. – majk

+0

예, 그 트릭은 포인터가 아니라 배열에만 적용되어야합니다. – Sergio

+1

더 중요한 것은 두 위치 모두 "작동"하지만 한 번 매개 변수의 경우와 같이 포인터 유형 (pointer-to-type)으로 변환되면 확실히 원하는대로 작동하지 않습니다. 이 경우에는 많은 경우에 오류가 발생하거나 경고없이 컴파일 될 수 있기 때문에 많은 엔지니어의 단점이되었습니다. – WhozCraig

0

당신은 그렇게 할 수 없습니다. achar* 유형이며 관련 크기가 없습니다. 이것이 버퍼에 출력하는 대부분의 표준 라이브러리 메소드가 버퍼 크기를 지정하는 추가 매개 변수를 갖는 이유입니다 (strncpy 참조).

관련 문제