0

我在观看教程时编写了这个程序,以比较 C 中“按值调用”和“按引用调用”之间的区别。但我得到了错误:

运行命令:第 1 行:1508 分段错误:11 ./"$2" "${@:3}"

帮助?

main() 
{
int a,b;
scanf("%d %d", &a, &b);
printf("Before Call %d %d", a,b);
exch_1(a,b);
printf("After first call %d %d", a,b);
exch_2(a,b);
printf("After second Call %d %d \n", a,b);  

}

exch_1(i,j)
int i, j;
{
    int temp;
    temp = i;
    i = j;
    j = temp;
}

exch_2(i,j)
int *i, *j;
{
    int temp;
    temp = *i;
    *i = *j;
    *j = temp;
}
4

2 回答 2

5

正如exch_2期望地址作为参数一样,您必须调用它exch_2(&a,&b);

您正在传递值,这些值被视为地址。如果 ega的值为5,则计算机将尝试使用5您计算机上 address 处的值 - 您的程序可能无法访问该值。

于 2013-08-10T01:15:21.187 回答
0

这是您的问题的正确代码。使用 gcc -Wall 编译您的原始代码。它会给你上面的代码很多警告,最好你需要修复所有这些。如果您不了解 linux 和 gcc,请学习一下。不要使用 turboC 编译器等旧工具

void exch_1(int i, int j);   // declare function prototype for exch_1 --> call by value
void exch_2(int* i, int* j);  // declare function prototype for exch_1 --> call by reference

int main()
{
    int a,b;

    scanf("%d %d", &a, &b);
    printf("Before Call %d %d\n", a,b);

    exch_1(a,b);  // call by value. changes done in exch_1 are not reflected here
    printf("After first call %d %d\n", a,b);

    exch_2(&a, &b);   // --> please see the change here for call by reference, you 
                      //should  pass address as the parameters
                      // changes done in exch_2 can be seen here since we pass address
                      // In you original program you are passing value of a and b as the 
                      // address.When you try to access those values in exch_2 the it leads
                      // to undefined behavior and so you can get segfault as well.
    printf("After second Call %d %d \n", a,b);

    return 0;    
}

void exch_1(int i,int j)
//int i, j;    // you do not need these variables
{
    int temp;
    temp = i;
    i = j;
    j = temp;
}

void exch_2(int* i,int* j)
//int *i, *j;   // this line not needed
{
    int temp;
    temp = *i;
    *i = *j;
    *j = temp;
}
于 2013-08-10T03:53:29.973 回答