在 C 中按值调用

Posted

技术标签:

【中文标题】在 C 中按值调用【英文标题】:Call by value in C 【发布时间】:2017-11-16 02:18:57 【问题描述】:

我是编程新手,目前正在研究 C。

我了解到 C 没有引用调用。我们编写的将实参地址传递给形参的程序在C语言中也是通过Value调用的。

如果我错了,请纠正我。但是,我运行了这个程序:

//使用函数交换两个数字。 #包括

void swap(int *,int *);

void main()

    int x,y;
    printf ("Enter the values of x and y : ");
    scanf("%d %d",&x,&y);

    swap(x,y);

    printf("The value of x = %d and y = %d",x,y);


void swap(int *a,int *b)

    int temp;

    temp=*b;
    *b=*a;
    *a=temp;

它编译得很好。但是,我在输出中遇到了分段错误。

它要求我输入 X 和 Y 的值,然后给出,Segmentation fault..

请帮忙!!

【问题讨论】:

你应该通过swap(&x,&y)来传递这些变量的地址。 如果您启用所有警告和调试信息,它不会编译。使用 gcc -Wall -Wextra -g 和 GCC 您收到您应该注意的警告。 你的编译器告诉你什么? 这段代码不是有效的 C。如果它编译了,那么你的编译器有严重问题。您必须找出它是否配置不正确,或者切换到更好的配置。 所有答案都清楚地指出了您的功能的问题所在。但我想补充一点,参数仍然是按值传递的。它是按值传递的变量的地址。 C 没有通过引用传递 【参考方案1】:

您将int 发送到需要int* 的函数,因此当您取消引用时-temp=*b; 您正在尝试访问您不拥有的内存-> 段错误。像这样拨打swapswap(&x,&y);

【讨论】:

【参考方案2】:

这么近

swap(&x,&y);

你没有传递引用(指针)

【讨论】:

【参考方案3】:

为避免在运行时出现类似的段错误,请始终使用-Wall 进行编译。

其实,在 C 中有一种通过引用传递的方法,只需将代码中的两行更改如下:

#define swap(x,y)  swap_impl__(&(x), &(y))

static void swap_impl__(int *a, int *b)

    int temp;
    temp=*b;
    *b=*a;
    *a=temp;


void main()

    int x,y;
    printf ("Enter the values of x and y : ");
    scanf("%d %d",&x,&y);

    swap(x,y);

    printf("The value of x = %d and y = %d",x,y);

【讨论】:

【参考方案4】:

将参数传递给函数的按值调用方法将参数的实际值复制到函数的形参中。在这种情况下,对函数内部参数所做的更改对参数没有影响。 但是在这里你传递值

swap(x,y)

但将其作为地址

void swap(int *a,int *b)

所以它正在寻找一个由你的变量传递的地址。 例如,如果您通过了类似

swap(x,y)

和 如果we have x=100 and y=200,则假设 100 和 200 为地址 并且尝试访问它肯定会给您带来错误,因为它们可能不存在或具有垃圾值。

【讨论】:

以上是关于在 C 中按值调用的主要内容,如果未能解决你的问题,请参考以下文章

在 lambda 演算中按值调用

为啥我要在 C 中按值传递函数参数?

csharp 在C#中按值比较两个对象

在c ++ 11中按值捕获成员变量的好方法是啥? [复制]

在 C++11 中按值或引用使用 lambda 默认捕获的缺点?

在C ++中的继承上下文中按值传递对象[重复]