2011-11-25 2 views
4

메신저하지만 초기화 할 수있는 다른 함수에서 sizeof char 배열 변수를 얻으려고 시도하지만 올바른 크기를 얻을 수 없습니다.find sizeof char array C++

int foo(uint8 *buffer){ 
cout <<"sizeof: "<< sizeof(buffer) <<endl; 
} 
int main() 
{ 
uint8 txbuffer[13]={0}; 
uint8 uibuffer[4] = "abc"; 
uint8 rxbuffer[4] = "def"; 
uint8 l[2]="g"; 
int index = 1; 

foo(txbuffer); 
cout <<"sizeof after foo(): " <<sizeof(txbuffer) <<endl; 
return 0; 
} 

출력은 아래 코드를 참조하십시오

sizeof: 4 
sizeof after foo(): 13 

원하는 출력은 다음과 같습니다

sizeof: 13 
sizeof after foo(): 13 

답변

5

당신은 캔트. foo에서는 "uint8_t 포인터"의 크기를 묻습니다. foo에 필요할 경우 크기를 별도의 매개 변수로 전달하십시오.

14

포인터만으로는 수행 할 수 없습니다. 포인터에는 배열의 크기에 대한 정보가 없습니다. 메모리 주소 일뿐입니다. 배열은 함수에 전달 될 때 포인터로 감쇠되기 때문에 배열의 크기를 잃게됩니다. 그런 다음 (다른 모든 기능처럼)이 같은 함수를 호출 할 수 있습니다

template <typename T, size_t N> 
size_t foo(const T (&buffer)[N]) 
{ 
    cout << "size: " << N << endl; 
    return N; 
} 

:

int main() 
{ 
    char a[42]; 
    int b[100]; 
    short c[77]; 

    foo(a); 
    foo(b); 
    foo(c); 
} 

출력 :

size: 42 
size: 100 
size: 77 
+0

+1. 내가 생각했던 것. –

+0

@Marlon im은 C++의 템플릿에 익숙하지 않으므로 함수 foo를 어떻게 호출해야합니까? 예제가 좋습니다. –

+0

@ user945511 내 대답을 편집했습니다. – Marlon

1

한 가지 방법은 그러나 템플릿을 사용하는 것입니다

일부 템플릿 마법 :

template<typename T, size_t size> 
size_t getSize(T (& const)[ size ]) 
{ 
    std::cout << "Size: " << size << "\n"; 
    return size; 
}