静态分配的数组作为C中的函数参数

时间:2013-09-26 04:34:58

标签: c arrays static allocation

我可以在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的(安培; 5); ?

谢谢!

3 个答案:

答案 0 :(得分:3)

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

“Decay”是一些类型在作为函数参数传递时的转换方式。即使v的类型为int [5],但当您将其传递给函数时,它也会变为int*。这是许多人不喜欢的行为,但没有什么可做的。

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

“正确”的事情(假设腐烂是正常的)是myFunc(v),就像你在你的片段中做的那样。请记住,在执行此操作时会丢失数组边界信息。

答案 1 :(得分:1)

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

此处v==&v[0]数组名称等于数组

的第一个元素的地址
    myFunc(v); 

将数组名称作为参数传递,这意味着您要传递数组中第一个元素的地址。

    void myFunc(int *vp)  

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

并且

    myFunc(&v);   

    &v==&&v[0];

& v是数组第一个元素的地址。

现在

  void myFunc(int *vp)      

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

答案 2 :(得分: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;
}

由于堆栈中断,这将导致分段错误。因为局部变量是堆栈。