c - 交换字符串是否按值传递而不是引用?

时间:2013-01-30 13:44:54

标签: c

我制作了一个交换两个字符串的代码:

void swap (char *a, char *b)
{
    char *t = a;
    a = b;
    b = t;
}

int main()
{
    char * strings[2];
    strings [0] = "luck!";
    strings [1] = "good ";
    swap (strings[0], strings[1]);
    printf( "%s %s\n",strings[0], strings[1]);
    return 0;
}

它失败了。我无法理解的是当我打电话给swap()时,我传了两个指针。两个指针都指向其指定数组的第一个字符。然后我在函数内部创建了一个临时指针并执行基本开关。这里有什么缺陷?我真的想明白为什么这种做法错了?

4 个答案:

答案 0 :(得分:7)

您正在切换函数的参数,这些参数是函数作用域的本地参数。执行函数时,参数(a,类型为char *,b的类型为char *)按值传递,放在堆栈上,然后执行函数。修改参数然后弹出堆栈而不起作用。

为了有所作为,您需要将引用传递给参数:

void swap (char **a, char **b)
{
    char *t = *a;
    *a = *b;
    *b = t;
}

然后拨打:

swap (&strings[0], &strings[1]);

现在,您将指针传递给strings中的各个数组元素,这些元素位于主要的堆栈段中,因此会持续超过swap的上下文。

答案 1 :(得分:0)

您将副本传递给指向该函数的指针,从而交换副本。在C中,你必须传递指向实际交换指针的指针。

答案 2 :(得分:0)

如果要通过指针交换值,则需要使用

形式的分配
*a = *b;

如果您在代码中执行此操作,它将交换字符串的第一个字符。要交换指针,您需要使用char**类型的参与者,并传递&strings[0]

答案 3 :(得分:0)

只是举个例子,关于其他答案的建议......

swap功能更新为

void swap (char **a, char **b)
{
    char *t = *a;
    *a = *b;
    *b = t;
}

然后在main中调用它

swap(&strings[0], &strings[1]);

但是,您可能希望将字符串的赋值更新为字符串,如“运气!”是不变的,你不能更新它的个别角色。

strings [0] = strdup("luck!");
strings [1] = strdup("good ");