1. 程式人生 > >如何寫出高質量c程式碼(一)C的陷阱

如何寫出高質量c程式碼(一)C的陷阱

1.函式宣告
首先讓我們來看一個函式的宣告

(* ( void  (*)() )0));

面對這樣的一個函式宣告也許有人會很迷惑,那麼我們來一步步剖析
第一我們要分清指向函式的指標和返回指標的函式
我前面的一篇部落格已經寫過關於指向函式的指標了,他的一般宣告方式是

void (*h)(); //h是指向返回值為void型別的指標
void *h();//這是一個返回void *型別的函式h

那麼我們把一個指標強制型別轉換成一個指向函式的指標就可以用

void  (*)() )xxx   //這裡的xxx指標,或者地址

還有一點要知道的是,其實我們的函式名就是一個地址

例如:
void
f();

但是我們呼叫的時候要用

f()去掉用,而不能直接用f  -----哈哈哈這個錯誤你肯定不會犯

所以我們一開始的時候那個宣告的意思就很明顯了

(* ( void  (*)() )0));//這是一個函式,執行0地址處的函式

2.分隔符要小心

例一:
if(a > 1);
a++;
例二:
ifa > 1a++;

這兩個例子的結果是截然不同的,不要為自己的程式碼留下隱患

3.二維陣列
二維陣列和二重指標,指標陣列,陣列指標的關係我將會在以後寫到,這裡僅僅寫比較易錯的地方

int a[3][5];
siezeof(a);   //這是二維陣列的總大小  即:3 * 5 *
4 sizeof(a[3]); //這是二維陣列的列大小 即:5 * 4 sizeof(a[3][5]); //這就是二維陣列的第三行第五列的元素的大小 int型別 4

這裡還有一點大家常問我的問題,為什麼sizeof(a)不是 4
我們在學校的時候很多老師都給我們說數”組名就是指標”,其實這是錯誤的,陣列和指標區別我也會寫在在接下來的部落格

4.指標的初始化
前些天一個同學讓我幫他找一個bug,其中有這樣幾行

int *p = NULL;
*p = 0

當我讓他給我講指標初始化的時候,他還理直氣壯的和我說,初始化了啊,你看

int *p = NULL;

哈哈,那我來仔細和他講講這個錯在哪裡

int *p  =  NULL//這是宣告一個指標p,並且讓他指向NULL,也就是0地址處

然後直接賦值,也就是直接修改了0地址處的值,導致出錯。這是一個很典型的錯誤。
5.外部引用
我們知道如果使用在其他檔案中定義的變數或者函式,那麼使用 extern關鍵字就可以使用了,這方面了多個檔案共享變數,但是會有一些易犯的錯誤,例如

file1.c
int array[10]; //file1.c中定義了array這個陣列
file2.c
extern int *array    //file2.c中宣告一個外部變數,且認為*array和array[]是等價的

這樣會導致錯,並且編譯器根本檢測不到

相關推薦

如何質量c程式碼C陷阱

1.函式宣告 首先讓我們來看一個函式的宣告 (* ( void (*)() )0)); 面對這樣的一個函式宣告也許有人會很迷惑,那麼我們來一步步剖析 第一我們要分清指向函式的指標和返回指標的函式 我前面的一篇部落格已經寫過關於指向函式的指標了,他的一

如何編寫質量C#程式碼

![](https://img2020.cnblogs.com/blog/191302/202009/191302-20200906200324825-1441892186.png) ### 從”整潔程式碼“談起 一千個讀者,就有一千個哈姆雷特,程式碼質量也同樣如此。 想必每一個對於程式碼有追求的開發

如何質量程式碼

引言 不重視程式碼質量的工程師永遠是初級工程師 為什麼專案維護困難、BUG 反覆?實際上很多時候就是程式碼質量的問題。程式碼架構就像是建築的鋼筋結構,程式碼細節就像是建築的內部裝修,建築的抗震等級、簡裝或豪裝完全取決於團隊開發人員的水平。 本文是筆者對於一些程式碼質

如何質量程式碼

3種錯誤處理的方法 在寫程式碼之前,要考慮單元測試。如果能夠設計全面的單元測試用例並在程式碼中體現出來,那麼寫出的程式碼自然也就是完整正確的了。通常我們從功能測試、邊界測試和負面測試三方面來設計測試用例。 其中,負面測試是指當輸入不符合要求的時候,程式還能做

小程序初體驗:手把手教你第一個小程序

輸入框 個人 創建 公測 快速 nsh 成功 too 調用 本文筆者將根據quick start中的範例代碼,帶大家簡單地剖析一下小程序的運行方式,並介紹小程序開發中一些通用的特性,帶著大家一步步寫出自己的小程序。 適用對象:前端初學者,對小程序開發感興趣者 tip

關於MATLAB轉C++程式碼

沒時間寫,上圖快一點, 1、寫好主執行檔案,m_18_10_30.m,並且執行 2、單擊MATLAB Coder 3、進入,選擇函式(而不是執行檔案) 4、Next,選擇執行的檔案,m_18_10_30.m 5、''let me enter...'',是開啟

Anaconda+django第一個web app

圖片 things tab tro ogr 參考 min sent clas 在安裝好Anaconda和django之後,我們就可以開始創建自己的第一個Web app,那麽首先創建一個空文件夾,之後創建的文件都在這個文件夾內。 啟動命令行進入此文件夾內,可以先通過如下命令查

C/C++之質量程式碼

      自從看了林銳博士的《高質量C++程式設計指南》以後,感覺自己以前寫的程式碼都是一些垃圾,真的low,根本不知道一些基本的程式設計規範,然後看了一些大神寫的程式碼,清晰易懂,而且還很漂亮,給人一種賞心悅目的感覺,寫一手高質量的程式碼,是一個程式設計師最基本的素養,

iOS 編寫質量Objective-C程式碼

級別: ★★☆☆☆ 標籤:「iOS」「Block」「Objective-C」 作者: MrLiuQ 審校: QiShare團隊 前言: 這幾篇文章是小編在鑽研《Effective Objective-C 2.0》的知識產出,其中包含作者和小編的觀點,以及小編整理的一些demo。希望能幫助大家以簡潔

iOS 編寫質量Objective-C程式碼

級別: ★★☆☆☆ 標籤:「iOS」「Foundation」「Objective-C」 作者: MrLiuQ 審校: QiShare團隊 前言: 這幾篇文章是小編在鑽研《Effective Objective-C 2.0》的知識產出,其中包含作者和小編的觀點,以及小編整理的一些demo。希望能幫助

iOS 編寫質量Objective-C程式碼

前言: 這幾篇文章是小編在鑽研《Effective Objective-C 2.0》的知識產出,其中包含作者和小編的觀點,以及小編整理的一些demo。希望能幫助大家以簡潔的文字快速領悟原作者的精華。 在這裡,QiShare團隊向原作者Matt Galloway表達誠摯的敬

怎樣才能質量的偽原創,並且排名在前?

站長 拿站 索引 思考 總結 失去 讀取 新增 操作方法 1、等價替換法 ①、文字排序法:如隨便拿本站的這篇文章“編輯寫偽原創文章的五大技巧”如何做等價替換法?通過近義詞以及打亂標題關鍵詞順序來達到等價替換,你可以改成“編輯五大技巧寫偽原創文章”,“五大技巧幫助編輯寫偽原創

4年前的隨筆---質量程序的要點

找到 post 規範 ++ 總量 word popu 清晰 之前 從1990年開始敲代碼。到如今已經快20年了。總結出寫出高質量程序的幾個要點: - 1、開始寫之前思路越清晰完整越好。 - 2、寫的過程中代碼一定要規範一致,這種代碼便於維護和改動。這個規範一致性包括名稱

SEO高手們如何質量的文章的?

SEO高手們如何寫出高質量文章的呢?下面太白就來給大家分享一下技巧。   首先先要了解什麼樣的文章稱得上高質量的文章?針對搜尋引擎而言,核心關鍵詞明確,內容相關性高,對使用者參考價值高,原創性時效性高,都能稱得上高質量文章,而對於使用者而言,排版乾淨且內容通俗易懂的都算是高質

C# 讀文字檔案並匯入Excel

一、本程式的主要思想    利用ReadAllText和WriteAllText方法讀寫文字檔案,並且把他們以逗號分隔,形成能被Excel直接匯入並且分列的資料。 二、程式的執行結果    執行前,必須在相應目錄建立文字檔案,方便程式的讀寫。程式執行前的資料如圖:   程

如何更好的程式碼文末有福利

女主宣言我們在過去的幾期推送裡已經給大家介紹了筆者根據多年研發經驗總結出來的編碼規範和 git

沒事點啥——C++掃雷

 先說明一下,本來這個文章我在新浪部落格上發過一次,但是不知道最近怎麼回事新浪總登不上去= =再加CSDN是專門為IT類服務的(我剛剛註冊的號,給我的印象是這樣)就在這再寫一次吧,這次我會盡量寫的詳細一點。 鄙人呢是個小白,會的不多也就是C++了,而且目前還是命令列版本

如何用正確的方法質量軟體的75條體會

    1. 你們的專案組使用原始碼管理工具了麼?   MVM:應該用。VSS、CVS、PVCS、ClearCase、CCC/Harvest、FireFly都可以。我的選擇是VSS。  2. 你們的專案組使用缺陷管理系統了麼?  MVM:應該用。ClearQuest太複雜,我

MSIL入門C#程式碼與IL程式碼對比

## 基礎概念 Microsoft中間語言(MSIL),也成為通用中間語言(CIL),是一組與平臺無關的指令,由特定於語言的編譯器從原始碼生成。MSIL是獨立於平臺的,因此,他可以在任何公共語言基礎架構支援特定的環境上執行。 通過JIT編譯器將MSIL轉換為特定計算機環境的特定機器程式碼。這是在執行MSI

級控件

try message return ogre nis sta click down ble 1.Toast信息提示框b1.setOnClickListener(new OnClickListener() { @Override public void onC