3

When we pass an array as an argument we accept it as a pointer, that is:

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

Here the base address gets stored in arr.

But when the passed array is accepted in this manner:

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

Does the memory get allocated for arr[5]?

If yes, then what happens to it?

If no, why isn't the memory allocated?

4

4 回答 4

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

在 C 中都是等价的。

C 表示将类型数组的参数调整为类型指针。

于 2013-08-03T15:54:17.897 回答
3

是否为 arr[5] 分配了内存?

不,它没有。

如果不是,为什么不分配内存?

因为没必要。数组在传递给函数时,总是衰减为指针。因此,虽然数组不是指针,指针也不是数组,但在函数参数中,以下代码是等价的:

T1 function(T2 *arg);
T1 function(T2 arg[]);
T1 function(T2 arg[N]);
于 2013-08-03T15:57:22.517 回答
0

希望以下代码/评论有所帮助。在编写 C 代码时,程序员必须确保许多项目在不同的程序中是一致的。这既是 C 编程的乐趣,也是祸根。

笔记。在参数列表中定义int arr[5]不会为正在传递的数据分配存储空间。该声明是有效的并且得到认可,但这仅仅是因为它允许编译器执行其类型检查。虽然,编译器会在调用函数时分配存储空间,但该存储空间不会存储您的数据。您必须通过显式声明(如以下示例中的 main )分配数据,或者您需要发出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);

    }

希望这会有所帮助,请询问更多信息。

于 2013-08-03T19:15:30.690 回答
0

当您在参数声明中放置数组大小时,该数字将被完全忽略。换句话说

void foo(int x[5]);

完全一样

void foo(int *x);
于 2013-08-03T15:55:21.793 回答