0

我做了一个代码来交换两个字符串:

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

4 回答 4

7

您正在切换函数的参数,这些参数是函数范围的本地参数。当您的函数执行时,参数(a,char* 类型,b,char* 类型)按值传递,放入堆栈,然后执行函数。参数被修改然后弹出堆栈没有效果。

要有所作为,您需要传递对参数的引用

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

然后调用:

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

您现在将指针传递给 中的单个数组元素strings,该元素位于 main 的堆栈段中,因此在swap.

于 2013-01-30T13:46:25.123 回答
0

您将副本传递给指向函数的指针,从而交换副本。在C您必须将指针传递给指针才能实际交换它们。

于 2013-01-30T13:46:31.240 回答
0

如果要通过指针交换值,则需要使用形式的赋值

*a = *b;

如果您要在代码中执行此操作,它将交换字符串的第一个字符。要交换指针,您需要具有 type 的参数char**,并通过&strings[0]

于 2013-01-30T13:49:17.430 回答
0

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

将您的swap功能更新为

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

然后在 main 中调用它

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

但是,您可能希望将字符串的分配更新为字符串,例如“luck!” 是恒定的,您不能更新其各个字符。

strings [0] = strdup("luck!");
strings [1] = strdup("good ");
于 2013-01-30T13:52:26.767 回答