2013-04-08 2 views
1

Я знаю, как определить размер массива после того как я создал его помощью SIZEOF В параметре:Как определить размер массива, переданного как параметр?

int arr[10]; 
printf("%i",sizeof(arr)/sizeof(int)); 

Но, как я понимаю, когда я передать массив в качестве параметра функции, Im Acctually передавая указатель к первому элементу массива, а не к фактическому массиву. Поэтому, если я буду использовать оператор sizeof, я получу размер указателя.

Я знаю, что я могу найти размер строки (массив символов), ища «\ 0». Поэтому давайте предположим, что мы говорим о int array;

Как определить размер массива, переданного в качестве аргумента?

ответ

1

Вы не можете, вы должны отправить измерения в качестве дополнительных параметров функции.

0

Путем либо нулевого завершения массива, либо путем пропускания количества элементов. Невозможно указать, сколько элементов содержится в массиве в C.

+0

Нулевое завершение массива целых чисел? Звучит не так. – DevNull

0

Необходимо передать его в качестве параметра функции. Или вам нужно объявить размер массива будет принят в качестве фиксированной ...

void myFunc(int* array, size_t numElements); 

или если размер массива является известной постоянной

void myFunc(int array[10]); 

или любой другой множество способов чтобы сделать размер массива доступным для функции (глобальные и т. д.). Это не встроенная функция C для определения размера массива через его указатель.

+1

Ваше второе предложение действительно не работает. – jxh

3

Как обычно, когда задан этот вопрос, появляется множество ответов, в которых говорится, что вы должны передать количество элементов в качестве параметра функции.

Это, конечно, неверно. Если функция должна знать количество элементов в массиве, вы должны предоставить информацию функции, но она может предоставляться различными способами. Это проще всего через параметр, но это может быть любая комбинация из нуля или более параметров, глобальное состояние, информация, указываемая прямо или косвенно параметрами или глобальным состоянием, статическая информация, помнящая предыдущие вызовы функций, некоторое качество в самом массиве (такие как дозорный), константы времени компиляции или почти любые другие средства, которые можно вообразить, и число может быть явно представлено в любом из вышеупомянутых или может быть вычислено или выведено из информации.

О единственном способе, которым вы не можете получить число элементов в массиве, - это стандартный механизм C, применяемый к передаваемому указателю.

1

Вы не можете. В C, когда вы передаете массив для работы, он decays от массива к указателю на тип, насколько это касается области действия.

Итак, рассмотрим это:

int arr[16]; 
sizeof(arr);   // sizeof WORKS 
myFunction(arr);  // Array decays to pointer, sizeof FAILS inside function 
myFunction(&arr[0]); // Array decays to pointer, sizeof FAILS inside function 

void myFunction(int* ptr) 
{ 
    // sizeof(ptr) will not give you what you would expect normally 
} 

Традиционный способ сделать это в C, чтобы иметь дополнительный параметр функции, то есть:

void myFunction(int* ptr, size_t mySize) 
{ 
} 

Или создать свою собственную структуру, которая держит указатель на массив и его размер, а именно:

typedef struct myType { 
    int* ptrToArray; 
    size_t arraySize; 
} myType_t; 

int array[16] = { 0 }; 
myType_t data; 
data.ptrToArray = array; 
data.arraySize = 16; 

void myFunction(myType_t data) 
{ 
} 
0

NULL Вы можете прекратить т он массив и цикл через приращение переменной каждый раз, пока она не достигнет NULL, это даст вам размер.

int arr[10] = {1, 2, 3, 4, 5, NULL}

или что-то подобное. В вашем случае вам, вероятно, придется написать NULL в текущий индекс + 1. Другие варианты, такие как создание struct, который имеет размер, вероятно, лучше, поскольку они стоят меньше.

0

Вопреки тому, что вы могли бы ожидать, что следующая программа завершается с кодом 1 (также @K Скотт Piel)

int f(int a[10]) 
{ 
     return sizeof(a)/sizeof(int); 
} 

int main(void) 
{ 
     int  a[10]; 
     return f(a); 
} 

Это действительно, как пара уже упоминалось: так как массив параметров в C просто указатель. Вы можете проверить свой компилятор, возможно, у него есть расширения, чтобы обойти его, но он сделает ваш код незарегистрированным.

Способ обхода его, путем обертывания массива внутри struct. Следующая программа делает выход с кодом 10.

typedef struct { int a[10]; } a10; 
int f(a10 a) 
{ 
     return sizeof(a)/sizeof(int); 
} 

int main(void) 
{ 
     a10  a; 
     return f(a); 
} 

Это немного больше хлопот, чтобы получить на элементах, хотя. Если вы хотите поддерживать различные размеры массивов, вам придется запрограммировать его самостоятельно (как указывали другие). Имейте в виду, что sizeof вычисляется во время компиляции и является константой в отношении компилятора. Он может варьироваться только от платформы к платформе.

О, и обратите внимание, что массив во втором примере передается по значению, тогда как он передается по ссылке в первом.

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