【问题标题】:statically allocated array as function argument in C静态分配的数组作为C中的函数参数
【发布时间】:2013-09-26 04:34:58
【问题描述】:

我可以在 C 中做到这一点吗:

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

int main() {

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

    return 0;
}

我的意思是,什么是正确的?我的函数(&v); ?

谢谢!!

【问题讨论】:

  • 您是因为遇到错误而询问,还是询问它是否始终如一地工作?
  • 试试看。运行。也许它有效。无论哪种方式,你都会学到一些东西。 :)
  • 是的!我似乎工作。当我在 VS2012 上运行它时,一切看起来都很好。但是当我在 Linux 上运行它时,我遇到了分段错误。我不知道这是否是问题所在。经过大约 4 小时的计算,我得到了分段错误。我问是因为我怀疑这可能是问题所在。

标签: c arrays static allocation


【解决方案1】:

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

“衰减”是某些类型在作为函数参数传递时的转换方式。即使v 的类型是int [5],当你将它传递给函数时它也会变成int*。这是很多人不喜欢的行为,但对此无能为力。

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

要做的“正确”事情(假设衰减是可以的)是做myFunc(v),就像你在你的sn-p中做的那样。请记住,这样做会丢失数组边界信息。

【讨论】:

  • 你可以改为传递 &v 然后在 myfunc 中取消引用它吗?这样可以避免衰变吗?
  • @JacKeown,没有办法访问不衰减数组的数组元素。在(*v)[0] 中,(*v) 在下标发生之前就已经衰减。
【解决方案2】:

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

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

    myFunc(v); 

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

    void myFunc(int *vp)  

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

还有

    myFunc(&v);   

    &v==&&v[0];

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

现在

  void myFunc(int *vp)      

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

【讨论】:

    【解决方案3】:

    你的代码是正确的它会工作.... 但是您应该特别注意检查边界条件。 请看代码。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-22
      • 1970-01-01
      • 2020-06-16
      • 1970-01-01
      • 2010-11-27
      • 2013-09-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多