女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

3個C語言編程易犯的錯誤

Q4MP_gh_c472c21 ? 來源:嵌入式ARM ? 2019-12-03 15:47 ? 次閱讀


典型錯誤1:指針指向

上述代碼意圖比較明顯:定義了一個int變量a和指針變量pa,并且把a的地址給了指針pa。接著通過鍵入給a賦值,但運行結果如下:

其實這個問題是我們學習指針的時候的一個典型錯誤了,我們知道調用scanf函數給變量賦值時,賦值對象要為地址的形式,通常是加取址符“&”,但是這里采用的是*pa的格式,這里涉及的指針相關知識前面給大家講過,為了更好地理解本題,就再重復一下: 對于指針來說,有己址、己值、它址、它值等特點,己址就是指針變量本身的地址,己值就是指針變量本身地址所存放的值,也就是我們通常說的指向的地址,這也正是它址,所以己值和它址意義是一樣的,而它值就是指針指向地址位置所存放的值。 而這里的*pa表示的意義就是它值a,那就是說這么寫的話下面兩行代碼是等價的:

scanf("%d", *pa);scanf("%d", a);

對比過后顯然是錯誤的,大家一眼看出a要寫成&a,這沒問題。但也有人說可以把*pa改成&pa,這樣行嗎?其實這么說的人還是對指針中己值和己址的概念沒搞清楚,&pa表示的意義是己址,即指針變量本身的地址,就是說你試圖用scanf修改指針變量本身地址上的值,而這個值原本是變量a的地址,其實就是在修改指針的指向!正確的寫法應該這樣:

scanf("%d",pa);

pa表示a的地址,即為它址,也就是&a,所以上面寫法才與下面的等價:

scanf("%d", &a);

典型錯誤2:getchar函數

char c;while((c=getchar())!=EOF){...}
這段代碼的本意是用getchar函數讀取緩沖區字符直到結束,但是在編譯運行時,發現上面幾行代碼一直報錯!邏輯上沒問題啊,那這究竟錯在哪里?讀者可以自己思考一下再往下看。

其實產生報錯的原因有兩點,一個是對getchar函數理解不到位,另一個是EOF的問題。
我們首先來說說getchar函數的問題,標準庫中給出了該函數的使用說明:在它讀取一個字符后,會將其轉換為int類型返回,所以首先char c要改為int c,關于getchar的問題還沒講完,后面還要說。 我們接著來看看EOF的問題,初學者對它的理解經常會有偏差,首先它是一個宏,定義于頭文件,為-1;其次它并不是很多人理解的文件結束符,實際上它是一個標志位,區別于其他所有字符的存在,表示一種沒有其他字符的信號。 講到這里,我們再回到getchar函數,由上面可以看出它的返回值必須是一個能包含所有字符的數據類型,方便它表示任意字符和EOF等標志位。 因此,上面代碼的錯誤就很明顯了,可能有兩種情況:1.如果編譯器中的char是有符號的且EOF被定義為-1,而恰好有字符等于0xff,那么getchar就會提前結束。當然,如果輸入全部是7位以下的字符,那很長時間不會有錯誤。2.如果編譯器中的char是無符號的,則實際的EOF值會被截斷,不再會識別為EOF,將會陷入無限循環。

這里肯定會有人問我們鍵入-1來模擬EOF跳出循環不行嗎?實際上是不行的,-1是有-和1兩個字符組成的,而getchar一次只能讀取一個字符,所以上述代碼EOF與從鍵盤輸入的字符無關,那這豈不是只能死循環了?當然不是,我們可以通過按鍵組合ctrl+d或者ctrl+z來指示結束,當然,這里的按鍵組合輸入只是我們的一種約定,不應該顯示檢查按鍵組合的值。

典型錯誤3:存儲機制

char *p = NULL;p = "hello world";strcpy(p, "hello world");
題目很簡單,就問這段代碼寫的有沒有問題,如果有,問題在哪里?

其實這個問題如果你對C語言的存儲機制非常熟悉的話,應該是很簡單的:我們簡單分析一下,第一行代碼是沒問題的,第二行意思是讓指針p指向字符串常量,單看也沒問題,而問題就出在第三行了,它的意圖是對指針p指向地址的內容進行修改,當然還用“hello world”只是為了增加點迷惑性而已。

上面說到了C語言的內存機制,其實第二行代碼過后,hello world 作為字符串常量存放于內存中的常量區,且是只讀,而此時指針p存放的是字符串常量的地址,第三行代碼企圖通過strcpy修改只讀段的內容,因此很明顯會報錯,這也是這三行代碼的問題所在了。

關于C的存儲問題,可能有的人還不太了解,那就借這個機會簡單給大家提幾句,這也是以前我寫過的問題:

一個編譯的C程序占用的內存分為以下幾個部分:
1、棧區(stack)—也稱自動類型存儲區,由編譯器自動分配釋放,存放函數的參數值,局部變量的值等,例如函數調用結束后自動釋放。

2、堆區(heap)—也稱動態分配內存區,由程序員分配釋放,從分配到程序結束為止,若不釋放,程序結束時可能由OS回收,比如malloc分配的內存,free釋放的內存。
3、全局區(靜態區)(static)—全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域,未初始化的全局變量和未初始化的靜態變量在相鄰的另一塊區域,程序結束后由系統釋放。

4、文字常量區—常量字符串放在這里,程序結束后由系統釋放。

5、程序代碼區—編譯后的程序代碼放在這里。 來看一個具體的C程序

怎么樣?問題雖然簡單,但也給我們以后寫代碼提了個醒,這種不易察覺的錯誤大家一定要小心再小心,盡量避免,就說到這里吧,感謝大家耐心閱讀!
-END-

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C語言
    +關注

    關注

    180

    文章

    7629

    瀏覽量

    140120
  • 函數
    +關注

    關注

    3

    文章

    4367

    瀏覽量

    64055

原文標題:3個C語言編程易犯的錯誤:也許你也犯過(附代碼)

文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    單片機c語言編程實例大全

    單片機c語言編程實例大全_18
    發表于 04-30 16:11 ?2次下載

    必看!15C語言常見陷阱及避坑指南

    ? C語言雖強大,但隱藏的“坑”也不少!稍不留神就會導致程序崩潰、數據異常。本文整理15高頻陷阱,助你寫出更穩健的代碼! ? 陷阱1:運算符優先級混淆? 問題:運算符優先級不同可能導致計算順序
    的頭像 發表于 03-16 12:10 ?395次閱讀

    gitee 支持的編程語言有哪些

    Gitee(碼云)是一基于 Git 的代碼托管和研發協作平臺,類似于 GitHub 和 GitLab。它支持多種編程語言,允許開發者托管和管理代碼,進行版本控制,以及協作開發。以下是一些
    的頭像 發表于 01-06 09:50 ?508次閱讀

    Triton編譯器支持的編程語言

    編寫和優化深度學習代碼。Python是一種廣泛使用的高級編程語言,具有簡潔易讀、易于上手、庫豐富等特點,非常適合用于深度學習應用的開發。 二、領域特定語言(DSL) Triton也提供了一種針對深度學習領域的特定
    的頭像 發表于 12-24 17:33 ?841次閱讀

    C++新手容易的十編程錯誤

    簡單的總結一下?C++ 新手容易的一些編程錯誤,給新人們提供一參考。 1 有些關鍵字在 cpp 文件中多寫了 對于
    的頭像 發表于 11-15 12:42 ?879次閱讀

    對比Python與Java編程語言

    Python與Java都是目前非常流行的編程語言,它們各有其獨特的優勢和適用場景。以下是對這兩種編程語言的對比: 一、語法和易用性 Python 語法簡潔,代碼更易讀,非常適合初學者。
    的頭像 發表于 11-15 09:31 ?871次閱讀

    NPU支持的編程語言有哪些

    NPU(Neural Processing Unit)是一種專門為深度學習和人工智能應用設計的處理器。NPU支持的編程語言通常與它所集成的平臺或框架緊密相關。以下是一些常見的編程語言
    的頭像 發表于 11-15 09:21 ?1705次閱讀

    C語言中的socket編程基礎

    。 Socket編程的基本步驟 在C語言中,socket編程的基本步驟如下: 步驟1:創建socket 步驟2:綁定socket到一地址和
    的頭像 發表于 11-01 16:51 ?975次閱讀

    MCU編程語言和開發環境介紹

    MCU編程語言 MCU編程語言是用于編寫MCU程序的高級編程語言,它們使得開發者能夠更高效地開
    的頭像 發表于 11-01 11:51 ?1924次閱讀

    C語言與Java語言的對比

    C語言和Java語言都是當前編程領域中的重要成員,它們各自具有獨特的優勢和特點,適用于不同的應用場景。以下將從語法特性、內存管理、跨平臺性、性能、應用領域等多個方面對
    的頭像 發表于 10-29 17:31 ?896次閱讀

    C語言與其他編程語言的比較

    C語言作為一種歷史悠久的編程語言,自其誕生以來,一直在軟件開發領域扮演著重要角色。它以其高效、靈活和可移植性強的特點,成為了系統級編程的首選
    的頭像 發表于 10-29 17:30 ?851次閱讀

    Orin芯片的編程語言支持

    語言支持 Orin芯片支持多種編程語言,以滿足不同開發者的需求。其中,C/C++和Python是兩種廣泛應用的
    的頭像 發表于 10-27 16:45 ?824次閱讀

    plc編程st語言怎么編

    PLC(可編程邏輯控制器)編程中的ST(Structured Text)語言是一種高級編程語言,它類似于Pascal或
    的頭像 發表于 08-25 10:05 ?2444次閱讀

    嵌入式C編程常用的異常錯誤處理

    嵌入式C編程中,異常錯誤處理是確保系統穩定性和可靠性的重要部分。以下是一些常見的異常錯誤處理方法及其詳細說明和示例: 1. 斷言 (Assertions) 斷言用于在開發階段捕獲程
    發表于 08-06 14:32

    PLC編程語言C語言的區別

    在工業自動化和計算機編程領域中,PLC(可編程邏輯控制器)編程語言C語言各自扮演著重要的角色。
    的頭像 發表于 06-14 17:11 ?4314次閱讀