2015-01-01 4 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 в качестве вывода.

Но, есть способ, которым я могу использовать оператор sizeof в функции в test и получить правильный размер. Или есть другой способ получить правильный размер. И еще одна причина, по которой я дал выше для вывода, поскольку 4 верен или нет?

Спасибо за любую помощь заранее ..: D

+1

'sizeof (a)' is 'sizeof (int *)', поэтому размер указателя. – Jarod42

+2

Вы не можете получить размер массива из указателя. И ваши параметры функции - оба указателя. – juanchopanza

+2

Несмотря на то, что вы передаете массивы в функции, какие функции получают, это указатели, а не массивы. – dasblinkenlight

ответ

2

Конечно, вы получите этот результат. sizeof любого указателя всегда 4 или 8 в зависимости от того, выполняется ли 32 или 64-битный процесс.

В целом, a - это больше, чем указатель, это статический массив известного размера во время компиляции. Однако в test это всего лишь указатель, ничего больше.

У вас есть 2 варианта, если вы не хотите, чтобы передать размер массива явно в вашем прототипе функции:

  1. Добавить дополнительный элемент в конце массива, сигнализирующее это последнее элемент (аналогично тому, как работают строки c)

  2. Вместо обычных массивов используются контейнеры STL, такие как std::vector<int>, какая кабина предоставляет вам размер массива с функциями-членами.

+1

3. Измените функцию, чтобы получить ссылки на массивы. – juanchopanza