我制作了一个交换两个字符串的代码:
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()
时,我传了两个指针。两个指针都指向其指定数组的第一个字符。然后我在函数内部创建了一个临时指针并执行基本开关。这里有什么缺陷?我真的想明白为什么这种做法错了?
答案 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 ");