Swap函式的寫法及其常見錯誤示例
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;
}
相關文章
- django | 常見 SQL 及其對應的 ORM 寫法DjangoSQLORM
- Python常見工廠函式用法示例Python函式
- Excel小技巧-公式和函式使用的常見八種錯誤合集Excel公式函式
- PHP編譯安裝時常見錯誤解決辦法,php編譯常見錯誤PHP編譯
- 【常見錯誤】--Nltk使用錯誤
- SSH常見錯誤
- MySQL 常見錯誤MySql
- 常見python資料型別及其相對應的函式Python資料型別函式
- 常見的錯誤 SQL 用法SQL
- Go常見錯誤集錦 | 字串底層原理及常見錯誤Go字串
- Go 常見錯誤集錦 | 字串底層原理及常見錯誤Go字串
- npm install 常見錯誤NPM
- Mysql:1236常見錯誤MySql
- Go常見錯誤第15篇:interface使用的常見錯誤和最佳實踐Go
- 常見的 PostgreSQL 升級錯誤SQL
- 一種錯誤的 if 寫法
- PbootCMS中常見的錯誤提示及其解決方案boot
- 常見函式之單行函式函式
- spring事務常見錯誤Spring
- opencv 編譯常見錯誤OpenCV編譯
- 使用 CocoaPods 時常見錯誤
- mysql8 常見錯誤MySql
- MySQL 安裝常見錯誤MySql
- SSL證書常見的錯誤和解決辦法是什麼?
- mdxbuilder打包mdx時的常見錯誤UI
- 常見的錯誤日誌型別型別
- 常見的授權錯誤及原因
- Git相關 | Git 常見的錯誤Git
- php常見的危險函式PHP函式
- Mac 上的 5 個常見錯誤程式碼以及修復辦法Mac
- Shell:常見錯誤總結(一)
- 8種常見SQL錯誤用法SQL
- 搭建github部落格常見錯誤Github
- 變數命名以及常見錯誤變數
- NPM INSTALL常見錯誤(windows篇)NPMWindows
- 常見 HTTP 錯誤程式碼大全HTTP
- 使用Python時常見的9個錯誤Python
- Golang開發常見的57個錯誤Golang