2013-09-26 44 views
1

我能做到这一点在C:静态分配数组作为C函数参数

void myFunc(int *vp) { 
    // do some stuff with vp 
} 

int main() { 

    int v[5] = {1,2,3,4,5}; 
    myFunc(v); 

    return 0; 
} 

我的意思是,这将是正确的? myFunc(& v); ?

谢谢!

+1

你问是因为你有错误还是询问它是否一致? – Ryan

+4

试试吧。运行。也许它有效。无论哪种方式,你学到了一些东西。 :) – Bucket

+0

是的!我似乎工作。当我在VS2012上运行它时,一切看起来都很好。但是当我在Linux上运行它时,出现了分段错误。我不知道这是否是问题。经过4个小时的计算,我得到了分段错误。我问,因为我怀疑这可能是问题所在。 –

回答

3

当您将它们作为参数传递时,数组衰减为指针。但是,数组衰减与获取数组地址不同。

“衰退”是如何将某些类型作为函数参数传递时进行转换。即使v的类型为int [5],但在将其传递给函数时,它将变为int*。这是很多人不喜欢的行为,但没有关系。

请注意,另一方面,&v的类型是int (*)[5],也就是指向一个由5个整数组成的数组的指针。这种类型不会衰减,也就是说,如果将它作为函数参数传递,它不会自动转换为另一种类型(并且这也是为什么在您的示例中使用它时不起作用,因为您需要一个指针整数,而不是一个整数数组的指针)。

“正确”的事情(假设衰退是好的)就是做myFunc(v),就像你在你的代码片段中做的那样。请记住,当你这样做时,你会失去数组边界信息。

1

是的......你的代码是正确的。

这里v==&v[0]阵列名称等于阵列

myFunc(v); 

传递数组名作为参数,这意味着要传递第一元件的地址在阵列的第一个元素的地址。

void myFunc(int *vp) 

这里您使用的是指针。它存储了传递的数组的第一个元素的地址,以便您可以通过增加指针位置来访问数组所覆盖的块。

而且

myFunc(&v); 

    &v==&&v[0]; 

& v是阵列的第一元件的地址的地址。

现在

void myFunc(int *vp)  

在这里,你得到了数组第一个元素的地址,这不是指向数组的地址。而是指向一些内存位置。现在,您不能通过增加指针来访问数组。

1

你的代码是正确的它会工作.... 但你应该格外小心检查边界条件。 请仔细查看代码。

void myFunc(int *vp) { 
    vp[5] = 30; 
} 

int main() { 

    int v[5] = {1,2,3,4,5}; 
    int a = 10; 
    printf("Value of a before fun call %d\n", a); 
    myFunc(v); 
    printf("Value of a before fun call %d\n", a); 
    return 0; 
} 

同样

void myFunc(int *vp) { 
    vp[5] = 30; 
    myFunc2(vp); 
} 

void myFunc2(int *vp) { 
    vp[6] = 30; 
} 

int main() { 

    int v[5] = {1,2,3,4,5}; 
    int a = 10; 
    printf("Value of a before fun call %d\n", a); 
    myFunc(v); 
    printf("Value of a before fun call %d\n", a); 
    return 0; 
} 

这将导致由于堆栈curruption段故障。由于局部变量处于堆栈状态。