我对将数组传递给函数有疑问。
请考虑以下代码段。
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中,如果它被声明为自动(main函数中的局部变量)。
请清除这一点。
答案 0 :(得分:7)
是的,当a
终止时,变量main()
将超出范围。
但是当fun1
正在执行时,main()
尚未达到终止,因此a
的内容仍然完全有效。
答案 1 :(得分:3)
你做得很好。数组a
确实超出了范围,但到那时你的函数已经完成,所以你不必担心访问不再存在的数据。如果您担心将变量作为数组名称传递(这很好),您可以随时单步执行代码以确保访问您认为自己的数据。
您还可以通过传递一个指定数组大小的附加整数参数来使您的函数更安全,而不是将其硬编码为4.如果您使用了该函数并传递了一个长度小于4的整数数组,它将访问越界内存。
答案 2 :(得分:1)
void fun1(int a1 [])正在创建进入函数的任何数组的副本。所以它会存在。
您也可以将其视为一个堆栈。将为main()方法创建一个堆栈。并且由于fun1()是从main方法调用的,所以只有当fun1()的堆栈被破坏时,main方法的堆栈才会被破坏。
答案 3 :(得分:0)
int a[]
等于const int *a
,因此不会发生任何错误,也不会隐式释放内存。