Почему размер массива, отправляемого в качестве параметра, не такой же, как в main?
#include <stdio.h>
void PrintSize(int p_someArray[10]);
int main () {
int myArray[10];
printf("%d\n", sizeof(myArray)); /* As expected, 40 */
PrintSize(myArray);/* Prints 4, not 40 */
}
void PrintSize(int p_someArray[10]){
printf("%d\n", sizeof(p_someArray));
}
sizeof
operator возвращает объект типаsize_t
, поэтому вы должны распечатать его с помощью%zu
(C99) или привести его,int
если вы используете%d
в своихprintf
вызовах, как указано выше .void PrintSize(int (*p_someArray)[10])
. Внутри функции вы можете получить доступ к массиву с помощью оператора разыменования*
:sizeof(*p_someArray)
. Это будет иметь тот же эффект, что и использование ссылок в C ++.Это указатель, поэтому в обычной реализации размер массива передается в качестве второго параметра функции.
источник
Как утверждали другие, массивы распадаются на указатели на свой первый элемент при использовании в качестве параметров функции. Также стоит отметить, что sizeof не оценивает выражение и не требует скобок при использовании с выражением, поэтому ваш параметр на самом деле вообще не используется, поэтому вы также можете записать sizeof с типом, а не значением.
источник
Итак, вам нужно будет передать длину массива в качестве второго параметра. Когда вы пишете код, в котором вы оба объявляете массив постоянного размера, а затем передаете этот массив функции, очень сложно, чтобы константа длины массива отображалась в нескольких местах вашего кода ...
K&R спешат на помощь:
Итак, теперь вы можете сделать, например:
источник
Поскольку массивы распадаются на указатели, когда они передаются в качестве параметров. Вот как работает C, хотя вы можете передавать «массивы» в C ++ по ссылке и решить эту проблему. Обратите внимание, что в эту функцию можно передавать массивы разного размера:
источник
В C ++ вы можете передать массив по ссылке именно для этой цели:
источник
Обнаруженное вами поведение на самом деле является большой бородавкой на языке C. Каждый раз, когда вы объявляете функцию, которая принимает параметр массива, компилятор игнорирует вас и изменяет параметр на указатель. Итак, все эти объявления ведут себя как первое:
a будет указателем на int во всех четырех случаях. Если вы передадите массив в func, он немедленно превратится в указатель на свой первый элемент. (В 64-битной системе 64-битный указатель вдвое больше 32-битного int, поэтому ваше соотношение sizeof возвращает 2.)
Единственная цель этого правила - поддерживать обратную совместимость с прошлыми компиляторами, которые не поддерживали передачу агрегированных значений в качестве аргументов функции.
Это не означает, что невозможно передать массив функции. Вы можете обойти эту бородавку, встроив массив в структуру (в основном это цель std :: array в C ++ 11):
или передав указатель на массив:
Если размер массива не является константой времени компиляции, вы можете использовать технику указателя на массив с массивами переменной длины C99:
источник
В языке C нет метода для определения размера неизвестного массива, поэтому необходимо передать количество, а также указатель на первый элемент.
источник
char[]
строковых массивов).Вы не можете передавать массивы функциям.
Если вы действительно хотите напечатать размер, вы можете передать указатель на массив, но он не будет универсальным, поскольку вам также необходимо определить размер массива для функции.
источник
Такое поведение было задумано.
Одинаковый синтаксис в объявлении параметра функции означает совершенно другое, чем в определении локальной переменной.
Причина описана в других ответах.
источник
В языке C, когда вы передаете массив в качестве аргумента функции, он автоматически преобразуется в указатель, а массив, передаваемый из одной функции, другая функция называется вызовом по ссылке. По этой причине вызываемая функция получает только указатель, указывающий на первый элемент функции. Это причина
fun (int a []) похож на fun (int * a);
поэтому, когда вы печатаете размер массива, он будет печатать размер первого элемента.
источник
В языке программирования C sizeof () - это оператор, и он возвращает размер объекта в байтах. Аргумент оператора sizeof () должен быть типом с левым значением (целое число, число с плавающей запятой, структура, массив Итак, если вы хотите узнать размер массива в байтах, вы можете сделать это очень просто: просто используйте оператор sizeof (), а в качестве его аргумента используйте имя массива, например:
Вывод в 32-битной системе будет: Размер n: 40. Так как в 32-битной системе размер равен 4 байта. В 64-битной системе это 8 байтов. В этом случае у нас объявлено 10 целых чисел в одном массиве. Таким образом, результат будет '10 * sizeof ( int) '.
Несколько советов:
Если у нас есть массив, объявленный как этот 'int n [] = {1, 2, 3, ... 155 ..};'. Итак, мы хотим знать, сколько элементов хранится в этом массиве. Используйте этот алгоритм:
sizeof (имя_массива) / sizeof (тип_массива)
Код: #include
основной(){
}
источник
sizeof(n)
локальной переменной иsizeof(arg)
аргументом функции, хотя оба они кажутся типовымиint[10]
.Размеры массивов невелики. По большей части массив - это указатель на память. Размер в вашем объявлении только сообщает компилятору, сколько памяти выделить для массива - он не связан с типом, поэтому sizeof () нечего делать.
источник