繁体   English   中英

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

[英]statically allocated array as function argument in 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);

谢谢!!

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

“衰减”是当作为函数参数传递时如何转换某些类型。 即使v的类型为int [5] ,当您将其传递给函数时,它也会变为int* 这是很多人不喜欢的行为,但与此无关。

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

要做“正确”的事情(假设衰减是可以的)是执行myFunc(v) ,就像您在代码段中所做的一样。 请记住,这样做会丢失数组边界信息。

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

这里v==&v[0]数组名称等于数组第一个元素的地址

    myFunc(v); 

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

    void myFunc(int *vp)  

在这里,您正在使用指针。 其中存储了要传递的数组第一个元素的地址,因此您可以通过增加指针位置来访问数组覆盖的块。

    myFunc(&v);   

    &v==&&v[0];

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

现在

  void myFunc(int *vp)      

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

您的代码是正确的。它将起作用。...但是您应该格外小心以检查边界条件。 请仔细阅读代码。

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

由于堆栈损坏,这将导致分段错误。 由于局部变量在堆栈中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM