2012-04-22 3 views
5

Можно создать дубликат:
sizeof array of structs in C?
sizeof an array passed as function argumentC - SizeOf целочисленный массив всегда возвращает 4

Просто пытаюсь написать основной sum() функцию.

int sum(int arr[]) { 
    int total = 0 , i = 0 , l = sizeof arr; 

    for(i=0;i<l;i++) { 
     total += arr[i]; 
    } 

    return total; 
} 

l всегда приравнивается к 4 (я знаю, что в конечном итоге разделить его на sizeof int)

Запуск Dev-C++ с опциями компилятора по умолчанию в Windows 7.

+2

'arr' - указатель, а не массив. Синтаксис, который вы используете в объявлении функции, - это просто глазная конфетка для 'int sum (int * arr)'. Вы можете прочитать раздел 6 [comp.lang.c FAQ] (http://c-faq.com/). – pmg

+0

скомпилировать/для 64-битной машины вы должны увидеть 8, поскольку вы смотрите на размер указателя, а не на размер массива. –

ответ

11

В качестве аргумента функции, массивы распадаются на указатели к типу элемента, поэтому sizeof arr - sizeof(elem*).

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

+0

Если вопрос содержит «4», напишите «sizeof (pointer)»

+0

Как я могу указать на массив, а не на первый элемент? Передача длины в качестве второго аргумента не является слабостью, к которой программист должен адаптироваться. –

+1

Если у вас есть 'int arr [5];', то '& arr' дает вам указатель на массив из пяти' int', 'int (*) [5]'. Адрес, однако, совпадает с адресом '& arr [0]', адресом первого элемента массива. Какой тип указателя вы хотите, зависит от ситуации. Для суммирования элементов массива, если вы не хотите иметь другую функцию для каждого размера ('int sum_5 (int (*) [5]);', 'int sum_6 (int (*) [6]);', у вас есть чтобы передать 'int *' и количество элементов. Вот как работает C. –

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