2013-08-03 3 views
3

Когда мы передаем массив в качестве аргумента мы принимаем его как указатель, то есть:Передача массива в функцию

func(array);//In main I invoke the function array of type int and size 5 

void func(int *arr) 

or 

void fun(int arr[])//As we know arr[] gets converted int *arr 

Здесь базовый адрес сохраняется в arr.

Но когда пропущенный массив принимается таким образом:

void func(int arr[5])//Works fine. 

ли получить выделяется память для обр [5]?

Если да, то что с ним происходит?

Если нет, то почему память не выделяется?

+0

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

ответ

3

ли получает выделяется память для обр [5]?

Нет, это не так.

Если нет, то почему память не выделена?

Потому что это не обязательно. Массив, когда он передается функции, всегда распадается на указатель. Таким образом, в то время как массивы не являются указателями и указатели не являются массивами, в качестве аргументов функции, следующие фрагменты кода эквивалентны:

T1 function(T2 *arg); 
T1 function(T2 arg[]); 
T1 function(T2 arg[N]); 
+0

Память должна быть выделена для 'arr [5]', и она должна иметь * область блока *. – haccks

+1

@haccks Как я уже сказал, нет, никакой памяти не выделяется вообще, если объявление находится в списке аргументов функции. –

+0

Я смущен после этого ответа! В определении функции 'f (int x) {int i; ...}', не выделяется память для 'x' и' i'? – haccks

3
void func(int *arr) 
void func(int arr[]) 
void func(int arr[5]) 

все эквивалентны в C.

С говорит параметром массива типа регулируется на указатель типа.

+1

На уровне ассемблера вы правы. На уровне языка вы не являетесь: 'void func (int arr [5])' утверждает, что вы передаете массив из 5 элементов, другие - нет. Я не совсем уверен, как компиляторы используют это для обнаружения ошибок, но по крайней мере 'sizeof (arr)' вернет 20 в последнем случае, а не в других. – cmaster

+2

@cmaster * void func (int arr [5]) утверждает, что вы передаете массив из 5 элементов * Это неверно, это эквивалентно 'void func (int * arr)'. * по крайней мере sizeof (arr) вернет 20 в последнем случае * Это также неверно, 'sizeof (arr)' равно 'sizeof (int *)' во всех трех функциях. – ouah

+3

@cmaster Нет, он не вернет '20'. Он не будет возвращать 'sizeof (int [5])' вообще. Перечисленные случаи ouah ** действительно, действительно эквивалентны. ** Функциональные аргументы - это особый случай - вы просто ** не можете иметь функции, принимающие аргументы массива. ** Массивы всегда распадаются на указатели при передаче функции, а семантика аргументов-аргументов соответствуют этому факту. [И вот доказательство.] (Http://ideone.com/EhF4Rt) –

0

Когда вы размещаете массив в объявлении параметра, номер полностью игнорируется. Другими словами

void foo(int x[5]); 

точно так же, как и

void foo(int *x); 
0

Надежда следующего код/​​комментарий помогает. При кодировании C программист должен гарантировать, что многие элементы согласуются в разных программах. Это и удовольствие, и ошибка программирования в C.

Примечание. Определение int arr[5] в списке параметров НЕ распределяет память для передаваемых данных. Объявление действительно и одобрено, но только потому, что оно позволяет компилятору выполнять проверку своего типа. Хотя, компилятор выделяет хранилище при вызове функции, что хранилище не хранит ВАШИ данные. Вы должны распределять свои данные либо через явное объявление (как в основном в следующем примере), либо вам нужно выдать заявление malloc.

Я запустил следующий код в компиляторе Eclipse/Microsoft C, а инструкции NO были отмечены предупреждением или ошибкой.

//In main invoke the functions all referring the same array of type int and size 5 

    void func1(int *arr) 
    { // arr is a pointer to an int. The int can be the first element 
     // of an array or not. The compiler has no way to tell what the truth is. 
    } 

    void func2(int arr[]) 
    { // arr is a pointer to an array of integers, the compiler can check this 
     // by looking at the caller's code. It was no way to check if the number 
     // of entries in the array is correct. 
    } 

    void func3(int arr[5]) 
    { // arr is a pointer to an array of 5 integers. The compiler can 
     // check that it's length is 5, but if you choose to overrun the 
     // array then the compiler won't stop you. This is why func1 and func2 
     // will work with arr as a pointer to an array of ints. 
    } 

    void main() 
    { 
     int data_array[5] = {2,3,5,7,11}; 

     func1(data_array); 

     func2(data_array); 

     func3(data_array); 

    } 

Надеюсь, что это поможет, пожалуйста, обратитесь за дополнительной информацией.

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