2012-07-27 201 views
0

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

请考虑下面的代码片段。

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]); 
    } 
} 

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

我对此很困惑,请你清除它。

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

请清除此。

+0

如果有任何答案解决了您的问题,请将其标记为已接受。 – 2012-10-07 23:53:38

回答

7

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

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

0

int a[]在函数声明/定义中等于const int *a所以没有什么不好的事情会发生,并且没有内存会被隐式释放。

3

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

你也可以通过传递一个额外的整数参数来使你的函数更安全,该参数指定你的数组的大小,而不是硬编码为4.如果你使用了你有的函数并且传递了一个长度小于4的整型数组,它将访问超出界限的内存。

1
  1. void fun1(int a1 [])正在创建任何进入该函数的数组的副本。所以它会存在。

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

+1

'fun1'不*创建数组的副本;它只创建一个指向第一个元素的指针副本。 – 2012-07-27 11:34:11