Проблема длины массива - PullRequest
       5

Проблема длины массива

3 голосов
/ 09 сентября 2011

Я читал документ о размещении csc, где я прочитал вопрос, связанный с оператором sizeof () массива языка c.Ответ был чем-то другим, тогда я ожидал.

int DIMension(int array[]) {
   return sizeof(array )/ sizeof(int);
}

main() {
   int arr[10];
   printf(“Array dimension is %d”, DIMension(arr));
}

Эта программа на языке c печатает 1 в качестве ответа.Почему это происходит?

Ответы [ 6 ]

8 голосов
/ 09 сентября 2011

Потому что int array[] это просто указатель, и его размер такой же, как у int.Я думаю, вы ожидали, что размер arr будет как-то передан в функцию, но это не сработает.Размер arr может быть определен только в той же области, где он был объявлен, потому что sizeof фактически работает во время компиляции.

6 голосов
/ 09 сентября 2011

Массив передается как указатель. Функция не может узнать, сколько места выделено массиву.

3 голосов
/ 09 сентября 2011

Все массивы распадаются на указатели, когда они передаются, поэтому выражение становится: sizeof(void*)/sizeof(int) что соответствует 1 на 32-битных машинах с 32-битной int с и 2 на 64-битных машинах с 32-битной int с.

2 голосов
/ 09 сентября 2011

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

1 голос
/ 09 сентября 2011

Массив в C очень хрупкий тип.Есть много ситуаций, в которых массив распадается на указатель на первый элемент, и передача массива в качестве аргумента функции является такой ситуацией.Вот:

int main()
{
  char data[10];        // sizeof(data) == 10
  return call_me(data); // data is equivalent to &data[0] here!
}

int call_me(char x[])
// int call_me(char * x)   // same thing!
{
  // here sizeof(x) == sizeof(char *)
  // ...
}

Массивы свойственны C в том смысле, что они не могут быть переданы в качестве аргументов функции или возвращены из функций, поэтому вы часто будете видеть указатели, когда ожидаете массивы.Вызывающий (вы!) Обязан предоставить достаточно информации, чтобы правильно интерпретировать указатель как массив.

Обратите внимание, что общая идиома C создает «массив» динамически полностью без упоминания типа массива:char * p = malloc(10); Здесь p - это не что иное, как указатель, и вы должны помнить, что вы можете рассматривать его как массив.

(Ситуация немного лучше в C ++, где выможет передавать фактические массивы по ссылке.)

0 голосов
/ 09 сентября 2011

См. Синтаксис определения функции можно записать следующим образом

 int DIMension(int array[]) {
 return sizeof(array )/ sizeof(int);
 }


 int DIMension(int *array) 
 {
 return sizeof(array )/ sizeof(int);
 }

int DIMension(int array[10])
{
return sizeof(array )/ sizeof(int);
}

Все эти три утверждения имеют одинаковое значение, и общим для всех трех является массив аргументов, который является ничем иным, как указателем на массив, который всегда будет 4 байта

...