2012-02-23 4 views
39

가능한 중복 :
Sizeof an array in the C programming language?
Why does a C-Array have a wrong sizeof() value when it's passed to a function?C에서 배열의 길이를 얻는 방법은 무엇입니까? "sizeof"가 해결책입니까?

는 아래의 코드를 참조 I는 다음과 같이 사용하는 경우 "를 sizeof"키워드의 차이점은 무엇입니까 내게 제안 :

#include<stdio.h> 
#include<conio.h> 
void show(int ar[]); 
void main() 
{ 
    int arr[]={1,2,3,4,5}; 
    clrscr(); 
    printf("Length: %d\n",sizeof(arr)); 
    printf("Length: %d\n",sizeof(arr)/sizeof(int)); 
    show(arr); 
    getch(); 
} 
void show(int ar[]) 
{ 
    printf("Length: %d", sizeof(ar)); 
    printf("Length: %d", sizeof(ar)/sizeof(int)); 
} 

되지만 출력이 같다 :

출력된다 :

길이 : 10

길이 : 5

기간 : 2

길이 : 1

나는 왜 이렇게되고있다. 하나의 배열에서 다른 배열로 전체 데이터를 가져 오려면 어떻게해야합니까?

나를 아는 사람.

+1

더 이상 정보없이 C의 배열 크기를 가져올 수 없습니다. – m0skit0

+0

@Oli Charlesworth : Google에서 검색했지만 제공 한 링크를받지 못했습니다. 제공 해주셔서 감사합니다. – alishaik786

+0

배열 매개 변수의 크기를 가져올 수 없습니다. –

답변

60

배열은 함수 호출시 포인터가 감소합니다. sizeof을 사용하는 것을 포함하여 어떤 식 으로든 포인터로만 표현되는 배열의 크기를 계산하는 것은 불가능합니다.

당신은 명시 적으로 인수를 추가해야합니다

: 전화에서

void show(int *data, size_t count); 

을, 당신은 실제 배열을 위해, 요소의 수를 계산하는 sizeof를 사용할 수 있습니다 sizeof가 당신에게 제공

int arr[] = { 1,2,3,4,5 }; 

show(arr, sizeof arr/sizeof *arr); 

하는 것으로 크기가 char인데, 이는 본질적으로 sizeof (int)에 의한 분류가 필요하거나 너무 높은 가치를 얻는 것입니다.

또한 관심과 청결의 관점에서 그 sizeof이 아니며 기능입니다. 인수가 유형 이름 인 경우 괄호가 필요합니다. 인수는 캐스트와 같은 표현식 (예 : sizeof (int))이기 때문입니다. 데이터 대신 sizeof을 실행하면 실제 유형의 이름을 지정하지 않고도 빠져 나갈 수 있습니다.

+1

show (arr, sizeof arr/sizeof * arr); – Soran

+0

@Soran 고마워, 고쳐! – unwind

+0

이것이 가장 좋은 일반적인 해결책이라고 생각합니다. 즉, 길이와 배열을 전달합니다. 정적 배열 (즉, 프로그램 실행 중에 길이가 변하지 않습니다)에 대해서도 가장 간단한 해결책은 배열 크기를 설정하는 것입니다 #define 전처리 정의로 소스 코드에서. 예 : #define ARRAY_SIZE 5 – Bill

1

show()는 2 바이트에 저장된 배열의 주소를 사용합니다. 그것을 int * ar라고 생각하십시오.

2

그 이유는 배열을 사용하는 함수를 작성할 때 두 개의 매개 변수가 선언되는 이유입니다. 하나는 배열에 대한 포인터이고 다른 하나는 배열의 크기를 정의합니다.

관련 문제