Swap函式的寫法及其常見錯誤示例

weixin_43973403發表於2020-10-13

Swap函式的寫法及其常見錯誤示例

資料交換在程式設計過程中十分常見,為方便起見,我們可以編寫一個函式Swap,用於兩個變數之間的資料交換,需要交換兩個變數的值呼叫函式Swap即可。但在編寫Swap函式的過程中,容易出現一些常見錯誤,下面便給出正確的寫法及其常見錯誤示例。

錯誤示例1:

void Swap(int a,int b)
{
int tmp;
tmp=a;
a=b;
b=tmp;
}

上面寫法的錯誤點在於沒有使用指標,被呼叫函式(子函式)中的同名變數值無法傳遞到主調函式(父函式)中;不同函式中的同名變數雖然變數名一樣,但他們的地址並不相同,這就導致被呼叫函式中的兩個變數交換了,而主調函式中的變數並未發生交換。該錯誤類似於定義在for迴圈裡的迴圈變數i無法傳遞到當前函式。
類似錯誤示例:

#include <stdio.h> 
int main()
{
 int i=0;
 for(int i=0;i<2;i++)
 {
  ;
 }
 printf("%d\n",i);
}

錯誤示例2:

void Swap(int *p1,int *p2)
{
	int *tmp;
	tmp=p1;
	p1=p2;
	p2=tmp; 
}

該寫法錯誤點在於沒有出現解引用,雖然兩個變數的地址發生了交換,但是他們的數值並未發生交換。假設要交換的變數是a和b,原先指向a的指標是p1,指向b的指標是p2;兩個指標交換後指向a的指標是p2,指向b的是p1;就相當於交換了變數a和變數b的地址,a和b的值並沒有交換。

錯誤示例3:

void Swap(int *p1,int *p2)
{
	int *tmp;
	*tmp=*p1;
	*p1=*p2;
	*p2=*tmp; 
}

改寫法錯誤是出現了野指標,即指標*tmp沒有初始化,他沒有指向的變數,計算機沒有訪問地址的許可權,這個地址可能存在,也可能不存在。就好比定義了一個整型變數a,在沒有給a賦值的情況下輸出a,也會出現類似的錯誤報告。該寫法可修改為在定義一個整型變數x,把x的地址賦值給tmp即可完成交換。修改後的程式碼如下:

void Swap(int *p1,int *p2)
{
	int *tmp;
	int x;
	tmp=&x;
	*tmp=*p1;
	*p1=*p2;
	*p2=*tmp; 
}

正確寫法示例:

#include <stdio.h>

void Swap(int *p1,int *p2)
{
	int tmp;
	tmp=*p1;
	*p1=*p2;
	*p2=tmp;
}

int main()
{
	int a=10;
	int b=20;
	Swap(&a,&b);
	printf("%d %d\n",a,b); 
	return 0; 
}

相關文章