通过值函数调用引用函数对结构的影响

时间:2017-11-14 11:32:20

标签: c

我在C编程。我通过"通过值方法"调用函数发送一个结构作为参数。在函数内部,我调用另一个需要"通过引用调用的函数"相同的结构。按值调用,应该复制结构并将此复制版本的指针发送到内部函数。我的问题是两个函数之外的原始结构是否将保持不变,无论我如何在函数内部发挥作用。

此外,按值调用,复制结构。与通过使用memcpy等其他算法手动复制其成员资料相比,这是非常快的。

功能播放更改值

的示例
#include<stdio.h>
#include<stdlib.h>

typedef struct{
    int dimension;
    double *vector;
}myVector;

void changeVec(myVector *X)
{
    X->vector[0]=100;
    X->vector[1]=200;
}

void foo(myVector X)
{
    changeVec(&X);
}

int main()
{
    myVector X;
    X.dimension=2;
    X.vector=malloc(sizeof(double)*X.dimension);
    X.vector[0]=1;
    X.vector[1]=2;
    printf("before function calling\n");
    for(int i=0; i<X.dimension; i++)
    {
        printf("%f ",X.vector[i]);
    }
    printf("\n");
    foo(X);
    printf("after function calling\n");
    for(int i=0; i<X.dimension; i++)
    {
        printf("%f ",X.vector[i]);
    }
    printf("\n");
    return 0;
}

2 个答案:

答案 0 :(得分:2)

  

我的问题是原始结构,外部是否兼具   无论怎样,我都会保持完好无损,如何在职能中发挥作用。

不,这取决于你如何玩这些功能。 说这是你的原始结构

struct Test{
  int x;
  char *p;
}

现在说你将结构Test的实例传递给你的第一个函数。 现在,这取决于你如何复制这个实例,如你所说? 如果不进行深层复制,则原始实例和副本可能使用变量p引用相同的内存位置。您可以对此主题进行一些research

答案 1 :(得分:1)

就调用者而言,通过值传递给函数的任何内容都保持“完整”。原因是传递的值是调用者提供的参数的COPY,对COPY的任何更改都不会影响原始值。

如果结构包含指针,则可以取消引用指针。以这种方式进行的任何更改 - 指针指向的数据 - 将对调用者可见。但是结构本身中指针的值不能改变。

编译器在创建结构副本时,通常会选择最有效的方法来复制它。通过“手动”复制成员来击败它的可能性很小。