我在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;
}
答案 0 :(得分:2)
我的问题是原始结构,外部是否兼具 无论怎样,我都会保持完好无损,如何在职能中发挥作用。
不,这取决于你如何玩这些功能。 说这是你的原始结构
struct Test{
int x;
char *p;
}
现在说你将结构Test
的实例传递给你的第一个函数。
现在,这取决于你如何复制这个实例,如你所说?
如果不进行深层复制,则原始实例和副本可能使用变量p
引用相同的内存位置。您可以对此主题进行一些research。
答案 1 :(得分:1)
就调用者而言,通过值传递给函数的任何内容都保持“完整”。原因是传递的值是调用者提供的参数的COPY,对COPY的任何更改都不会影响原始值。
如果结构包含指针,则可以取消引用指针。以这种方式进行的任何更改 - 指针指向的数据 - 将对调用者可见。但是结构本身中指针的值不能改变。
编译器在创建结构副本时,通常会选择最有效的方法来复制它。通过“手动”复制成员来击败它的可能性很小。