当我尝试使用指针交换这两个整数时,我得到了分段错误。
基本上在我交换之前,x
已分配给1
而y
已分配给2
。交换后x
已分配给2
,y
已分配给1
。
该程序采用两个整数x
和y
,据说可以交换它们:
int swap(int x, int y){
int *swapXtoY;
int *swapYtoX;
*swapXtoY = y;
*swapYtoX = x;
}
答案 0 :(得分:7)
函数swap
期望它的两个参数都为int
,但您传递的是int *
。编译器应该对此提出警告。
似乎你不知道指针在C中是如何工作的。你的函数只是将两个int
分配给局部变量。功能应该是:
int swap(int *x, int *y){
int temp;
temp = *x;
*x = *y;
*y = temp;
}
答案 1 :(得分:5)
swap
方法应该接受两个指针,而不是两个整数
试试以下。
int swap(int* x, int* y){
int temp = *x;
*x = *y;
*y = temp;
}
答案 2 :(得分:1)
你必须按地址将变量传递给函数来改变它们的值。也就是说,你的函数也应该指向指针。这是一个可以交换任何C
数据类型的变量的泛型函数:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void Swap(void *x,void *y,size_t bytes);
int main(void)
{
int x = 3, y = 4;
Swap(&x,&y,sizeof(int));
printf("x now : %d\n",x);
printf("y now : %d\n",y);
return 0;
}
void Swap(void *x,void *y,size_t bytes)
{
void *tmp = malloc(bytes);
memcpy(tmp,x,bytes);
memcpy(x,y,bytes);
memcpy(y,tmp,bytes);
free(tmp);
}
答案 3 :(得分:0)
首先,你的函数通过值 1 传递它的参数,这使得函数不可能对它们进行任何持久的更改。
其次,交换习语包括:
定义一个中间变量temp
,它初始化为两个变量之一,例如x
。
将第二个变量y
的值分配给第一个(保存在temp
)变量x
(现在{ {1}}的值为temp
,x
的值为x
)。
最后,将y
分配给第二个变量temp
(现在y
的值为x
,反之亦然)
在C代码中,这看起来像:
y
然后调用函数:
void swap (int *x, int *y ) {
// dereference x to get its value and assign it to temp
int temp = *x;
// dereference x and assign to it the value of y
*x = *y;
// complete the swap
*y = temp;
}
您可能想要检查dereference operator *或address-of operator &。
的含义1。按值:它传递传递的变量的副本,这可以防止在函数外部进行任何更改。