0

我对将数组传递给函数有疑问。

考虑以下代码片段。

void main()
{
    int a[4]={10,20,30,40};
    fun1(a);
}

void fun1(int a1[])
{
  for(int i=0;i<4;i++)
  {
      printf("%d\n",a1[i]);
  }
}

传递数组只不过是传递第一个位置的地址。我应该传递上面的数组及其名称(数组的起始地址)。我的怀疑是因为 a[4] 是一个自动变量,它应该在它从主函数中出来时死掉并且它应该给出意想不到的结果(指针应该是悬空的)。但它工作正常。

我对此感到非常困惑,请您清除它。

即使我们将单个元素int a作为传递f(&a),它也不应该存在于函数 f 中,如果它被声明为自动(主函数中的局部变量)。

请也清除这一点。

4

4 回答 4

7

是的,变量在终止a时将超出范围。main()

但是当fun1正在执行时,main()还没有达到终止,所以 的内容a仍然是完全有效的。

于 2012-07-27T07:12:10.407 回答
3

你在做什么很好。该数组a确实超出了范围,但此时您的函数已经完成,因此您不必担心访问不再存在的数据。如果您担心将变量作为数组名称传递(这很好),您可以随时单步执行您的代码,以确保您访问的是您认为的数据。

您还可以通过传递一个额外的整数参数来指定您的数组的大小而不是将其硬编码为 4,从而使您的函数更安全。如果您使用了您拥有的函数并传递了一个长度小于 4 的整数数组,它将是访问越界内存。

于 2012-07-27T07:18:12.620 回答
1
  1. void fun1 (int a1[]) 正在创建进入函数的任何数组的副本。所以它会存在。

  2. 您也可以将其视为堆栈。将为 main() 方法创建一个堆栈。而且由于 fun1() 是从 main 方法调用的,所以 main 方法的堆栈只有在 fun1() 的堆栈被销毁时才会销毁。

于 2012-07-27T07:22:37.287 回答
0

int a[]在函数声明/定义中等于const int *a所以不会发生任何不好的事情,也不会隐式释放内存。

于 2012-07-27T07:12:32.363 回答