将函数中声明的本地数组传递给另一个

时间:2015-08-27 16:50:33

标签: c arrays


我的标题清楚地表达了我的问题。让我抓住机会:
请查看以下代码:

#include <stdio.h>
int myf2(int *ser){
    *ser=4;
    printf("\nsecond=%d",*ser);
    return 0;   
}
int myf1(){
    int fil[2];
    fil[0]=1;
    printf("\nfirst=%d",*fil);
    myf2(fil);
    printf("\nthird=%d",*fil);
    return 0;
}
int main(){
    myf1();
}

我期待这个输出:

first=1
second=4
third=1


输出结果为:

first=1
second=4
third=4

那么如何将 fil 数组传递给 myf2 函数,以便第三个printf打印1而不是4

你能解释一下我的代码错误的原因吗?我在本地声明这个数组。但正如你所看到的那样,事实上不是本地的:)

最好的问候

4 个答案:

答案 0 :(得分:1)

将数组传递给函数时,实际上是将指针传递给列表中的第一个元素。

在您的函数中,ser指向列表中的索引0。因此*serser[0]相同。同样,在定义fil的地方,*fil相当于fil[0]

答案 1 :(得分:1)

当然按值传递数组。不幸的是,目前的C&#39;是不可能的。语言(因为糟糕的设计决定)。这就是为什么你应该使用结构hack,使你的数组​​成为数据成员,因为结构可以直接复制。所以你的例子看起来像这样:

#include <stdio.h>

typedef struct {
     int d[2];
} array_of_2;

int myf2(array_of_2 ser){
    *ser.d=4;
    printf("\nsecond=%d",*ser.d);
    return 0;   
}
int myf1(){
    array_of_2 fil;
    fil.d[0]=1;
    printf("\nfirst=%d",*fil.d);
    myf2(fil);
    printf("\nthird=%d",*fil.d);
    return 0;
}
int main(){
    myf1();
}

您必须使用点和&#39; d&#39;来引用数组。不幸的是因为类型&#39; array_of_2&#39;实际上是一个结构。

在你的情况下发生的事情是你实际上是将指针传递给你的数组第一个元素。所以&#39; myf2&#39;本地(也是一个功能参数)&#39; ser&#39;只接收“myf1&#39;范围内的本地地址然后编辑它。

一些插图:

enter image description here

enter image description here

局部变量和所有其他类型(如全局变量)仅在其生命周期中是特殊的。否则,您可以编辑它们的功能没有限制。

变量是在满足它的声明时保留的内存,并在它的作用域结束时释放(在函数返回时为本地的情况)。同时,这个记忆可以由其他功能自由编辑。

答案 2 :(得分:1)

变量实际上是两件事,一个标识符,你给它的名字和一个对象,你命名的东西。

范围的概念仅适用于标识符:它是代码的一部分,在该代码中,可以使用您提供的名称访问该对象。范围是编译时功能。

物品没有范围,它们有一生。如果你在这里有一个局部变量,那么当你的执行进入声明变量的范围时,生命周期就会开始,当你离开它时它就会结束。在调用myf2期间,您的对象继续存在,因此可以毫无问题地访问。

此访问是通过您传递给调用中的函数的指针完成的。由于指针指向原始对象,因此您在此处所做的所有更改都将更改为原始对象,并且在您从通话中返回时仍然可见。

答案 3 :(得分:0)

您的代码没有任何问题。本地数组保持不变,直到myf1的范围存在。它只是你将数组的基本元素的地址传递给函数从而对原始数组进行更改。

所以要解决你的问题 -

  1. int myf2(int *ser)声明您的身份为int myf2(int ser)

  2. 在功能中ser=4

  3. 在功能myf1中调用此myf2 - myf2(*fil);

  4. 因此,fil的价值不会发生变化,因为*fil的副本已创建并修改为4,因此*fil的原始值保持不变。< / p>

    工作代码 - https://ideone.com/g32wnQ