2015-01-01 1 views
-1

2 개의 배열이 있습니다. 1은 1D 배열이고, 두 번째 배열은 2D 배열입니다. 둘 다 함수로 전달합니다. 함수에서 sizeof 연산자를 사용하려고 시도하면 main 자체가 사용됩니다. 그러나, 그것은 나에게 2 개의 다른 출력을 준다. sizeof C++의 연산자

내 프로그램 ::

#include <iostream> 
using namespace std; 
void test(int *a,int b[][10]){ 
    cout<<"Inside Test"<<endl; 
    cout<<sizeof(a)<<endl; 
    cout<<sizeof(b)<<endl; 
} 
int main() { 
    // your code goes here 
    int a[10]; 
    int b[10][10]; 
    cout<<sizeof(a)<<endl; 
    cout<<sizeof(b)<<endl; 
    test(a,b); 
    return 0; 
} 

이 출력 ::

40 
400 
Inside Test 
4 
4 

기능 test의 출력이 나를에 따라 포인터의 크기는이다. (제발 내가 틀렸다면 제발 정정하십시오) 내가 믿는 한 가지 가능한 이유는 함수 호출이 내 배열의 주소를 함수의 다른 위치에 복사하기 때문에 액세스로 인해 4가 출력되기 때문입니다.

그러나, test에있는 함수에서 sizeof 연산자를 사용하고 정확한 크기를 인쇄 할 수있는 방법이 있습니까? 또는 올바른 크기를 얻는 다른 방법이 있습니다. 그리고 더 이상 제가 4이 올바른 것인지 아닌지에 대한 결과를 위해 위에 주어진 이유가 무엇입니까?

사전에 도움을 주셔서 감사합니다. : D

+1

sizeof (int)는 sizeof (int *)이므로 포인터의 크기입니다. – Jarod42

+2

포인터에서 배열의 크기를 얻을 수있는 방법은 없습니다. 그리고 함수 매개 변수는 모두 포인터입니다. – juanchopanza

+2

배열을 함수로 전달하더라도 함수는 배열이 아니라 포인터입니다. – dasblinkenlight

답변

2

물론 그 결과를 얻을 것입니다. 모든 포인터의 sizeof은 32 비트 또는 64 비트 프로세스를 실행 중인지에 따라 항상 4 또는 8입니다.

주 키보드에서 a은 포인터 이상이며, 컴파일시 알려진 크기의 정적 배열입니다. 그러나 test에서는 포인터 일 뿐이며

  1. 이가 마지막 신호 배열의 마지막에 추가 요소를 추가합니다 : 당신이 명시 적으로 함수 프로토 타입의 배열의 크기를 통과하지 않으려면

    당신은 두 가지 옵션이 있습니다 (C 문자열 작업 방식과 유사) 요소

  2. 일반 배열은 당신에게 멤버 함수와 배열의 크기를 제공하는 택시 std::vector<int> 같은 STL 컨테이너를 사용하는 대신에 f를.

+1

3. 배열을 참조하도록 함수를 수정합니다. – juanchopanza