2012-03-01 2 views
6

Возможный дубликат:
Sizeof array passed as parameterC Размер ++ из массива

Я глупо с этим SizeOf оператора в C++, у вас есть какие-либо идеи, почему это 4 и 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

[Размер массива передан как параметр] (http://stackoverflow.com/questions/1328223/sizeof-array-passed-as-parameter) – Blastfurnace

+0

См. Также http://stackoverflow.com/questions/1641957/is- array-name-a-pointer-in-c и http://stackoverflow.com/questions/720077/calculating-size-of-an-array - это FAQ. –

ответ

23

В main, имя array является массивом, так что вы получите размер в байтах массива с sizeof. Тем не менее, массив переходит в указатель при передаче функции, поэтому вы получаете sizeof(int*) внутри функции.

Имейте в виду, что принимает аргумент в виде T arg[] является точно же, как и принимать аргумент T* arg. Таким образом, ваша функция представляет собой точный эквивалент

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

Ваша следующая программа похожа на следующую.

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

Программа, указанная ниже, печатает указатель.

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

эквивалентно

void function (int *arg) 

таким образом,

sizeof(arg) == sizeof(int*) 

Если вы намерены передать сам массив, то C++ предлагает вам передать его по ссылке:

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

Теперь

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

Массивы просто указатели на произвольное количество памяти. Если вы делаете sizeof (array), он вернет размер указателя - 4 байта в 32-битных системах и 8 байтов в 64-битных системах (если программа скомпилирована как 64 бит).

Это по той же причине, что вы должны оканчивать нуль строк в c/C++ - обозначать конец массива.

Проще говоря, вы сами отслеживаете размер своих массивов. Если вы выделяете массив из 40 байтов, вы должны убедиться, что никогда не получаете доступ к массиву выше 40-го индекса (т. Е. Array [39]).

Надеюсь, это поможет.

+0

Если массивы - это просто указатели, то как они попадают внутрь 'main', он печатает 12? – fredoverflow

+0

Я не могу быть на 100% уверенным, но я предполагаю, что ваш массив статичен. Размер определяется во время компиляции, в отличие от динамической памяти.Sizeof() может работать на статических массивах, но я могу заверить, что он не будет работать с массивами, которые динамически распределяются во время выполнения. – Gogeta70

+1

массивы - это не просто указатели. – xaxxon

Смежные вопросы