2012-03-01 72 views
6

thể trùng lặp:
Sizeof array passed as parameterC++ Kích thước của mảng

tôi là ngu ngốc với nhà điều hành sizeof này trong C++, bạn có bất kỳ ý tưởng tại sao nó là 4 và 12?

void function (int arg[]) { 
     cout<<sizeof(arg)<<endl; // 4 
    } 

    int main() 
    { 
     int array[] = {1, 2, 3}; 
     cout<<sizeof array<<endl; // 12 
     function (array); 
     return 0; 
    } 
+2

[Kích thước của mảng được truyền dưới dạng tham số] (http://stackoverflow.com/questions/1328223/sizeof-array-passed-as-parameter) – Blastfurnace

+0

Xem thêm http://stackoverflow.com/questions/1641957/is- array-name-a-pointer-in-c và http://stackoverflow.com/questions/720077/calculating-size-of-an-array - đây là một câu hỏi thường gặp. –

Trả lời

23

Trong main, tên array là một mảng để bạn có được kích thước tính bằng byte của mảng với sizeof. Tuy nhiên, một mảng phân rã thành một con trỏ khi được truyền đến một hàm, vì vậy bạn có được sizeof(int*) bên trong hàm.

Lưu ý rằng tham gia một đối số dưới dạng T arg[]chính xác giống như tham số là T* arg. Vì vậy, chức năng của bạn là tương đương chính xác của

void function(int* arg) { 
    cout << sizeof(arg) << endl; 
} 
0

Chương trình của bạn dưới đây tương tự như chương trình tiếp theo.

void function (int arg[]) { 
    cout<<sizeof(arg)<<endl; // 4 
} 

Chương trình bên dưới in kích thước con trỏ.

void function (int *arg) { 
    cout<<sizeof(arg)<<endl; // 4 
} 
4
void function (int arg[]) // or void function (int arg[N]) 

tương đương với

void function (int *arg) 

do đó,

sizeof(arg) == sizeof(int*) 

Nếu bạn có ý định để vượt qua mảng chính nó, sau đó C++ cung cấp cho bạn để vượt qua nó bằng cách tham khảo:

void function (int (&arg)[3]) 
       // ^^^ pass by reference 

Bây giờ,

sizeof(arg) == sizeof(int[3]) 
-1

Mảng chỉ đơn giản là con trỏ đến một số lượng tùy ý bộ nhớ. Nếu bạn làm sizeof (mảng) nó sẽ trả về kích thước của một con trỏ - 4 byte trên các hệ thống 32 bit và 8 byte trên các hệ thống 64 bit (nếu chương trình được biên dịch thành 64 bit).

Đây cũng chính là lý do bạn phải hủy bỏ chuỗi của mình bằng c/C++ - để biểu thị phần cuối của mảng.

Nói một cách đơn giản, bạn tự theo dõi kích thước mảng của mình. Nếu bạn phân bổ một mảng 40 byte, bạn phải chắc chắn rằng bạn không bao giờ truy cập vào mảng trên chỉ mục thứ 40 (ví dụ mảng [39]).

Hy vọng điều này sẽ hữu ích.

+0

Nếu mảng chỉ đơn giản là con trỏ, làm thế nào đến bên trong 'main' nó in 12? – fredoverflow

+0

Tôi không chắc chắn 100%, nhưng tôi đoán là vì mảng của bạn là tĩnh. Kích thước của nó được xác định tại thời gian biên dịch, không giống như bộ nhớ động.Sizeof() có thể hoạt động trên các mảng tĩnh, nhưng tôi có thể đảm bảo với bạn rằng nó sẽ không hoạt động trên các mảng được phân bổ động trong thời gian chạy. – Gogeta70

+1

mảng không chỉ đơn giản là con trỏ. – xaxxon

Các vấn đề liên quan