chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

3天內(nèi)不再提示

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

Q4MP_gh_c472c21 ? 來源:嵌入式ARM ? 2019-12-03 15:47 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群


典型錯誤1:指針指向

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

其實這個問題是我們學習指針的時候的一個典型錯誤了,我們知道調(diào)用scanf函數(shù)給變量賦值時,賦值對象要為地址的形式,通常是加取址符“&”,但是這里采用的是*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函數(shù)

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

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

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

典型錯誤3:存儲機制

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

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

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

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

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

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

4、文字常量區(qū)—常量字符串放在這里,程序結束后由系統(tǒng)釋放。

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

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

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

    關注

    183

    文章

    7644

    瀏覽量

    145667
  • 函數(shù)
    +關注

    關注

    3

    文章

    4417

    瀏覽量

    67568

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    C語言C++的區(qū)別及聯(lián)系

    創(chuàng)建源文件時什么都不給,默認是.cpp。 3、返回值 C語言中,如果一函數(shù)沒有指定返回值類型,默認返回int類型;C++中,如果一
    發(fā)表于 12-24 07:23

    C語言C++之間的區(qū)別是什么

    ,尤其是在涉及到類型轉(zhuǎn)換時,會盡量防止隱式的、可能導致問題的類型轉(zhuǎn)換。 相比之下,C語言允許更多的靈活性,但也更容易產(chǎn)生類型相關的運行時錯誤,因為其類型檢查不如C++嚴格。
    發(fā)表于 12-11 06:23

    單片機C語言編程的心得

    寫這個8*8按鍵程序的過程中,不管是在自己寫還是參考別人程序的過程中,發(fā)現(xiàn)自己對C語言有些基本知識點和編程規(guī)范有很多不懂的地方,有些是自己以前的編程習慣不好,有些就是基礎知識不扎實的表
    發(fā)表于 12-08 07:44

    C語言中除數(shù)為0屬于什么錯誤

    0 的錯誤,以及援引數(shù)組元素時下標溢出等。 靜態(tài)錯誤又可以分為語法錯誤和靜態(tài)語義錯誤。語法錯誤指有關
    發(fā)表于 12-08 06:38

    為什么單片機還在用C語言編程?

    說起單片機我們就會想到C語言,單片機為什么還在用C語言編程?現(xiàn)在有很多很好用的高級語言,如VC、
    發(fā)表于 11-28 07:37

    C語言編程技巧

    成員是一未知大小的數(shù)組,適用于動態(tài)分配內(nèi)存并關聯(lián)一可變長度的數(shù)組。? ?3、匿名結構體和聯(lián)合體?:C
    發(fā)表于 11-27 06:46

    C語言和單片機C語言有什么差異

    區(qū)別是由編譯器決的,只能參考對應的編譯手冊,即使同種平臺不同的編譯器對C的擴展也有不同。 3、單片機c語言編程是基于
    發(fā)表于 11-14 07:55

    一文了解Mojo編程語言

    Mojo 是一種由 Modular AI 公司開發(fā)的編程語言,旨在將 Python 的易用性與 C 語言的高性能相結合,特別適合人工智能(AI)、高性能計算(HPC)和系統(tǒng)級
    發(fā)表于 11-07 05:59

    第4章 C語言基礎以及流水燈的實現(xiàn)(4.3 4.4)

    的符號分別是:+、-、*、/、%。 C語言有一很重要的賦值運算符“=”,前邊程序有使用過。在C語言里,“=”代表的意思是賦值,而不是等于。
    的頭像 發(fā)表于 10-29 15:30 ?345次閱讀

    避雷!樹莓派初學者常犯的5錯誤!

    如果你剛剛入手樹莓派,你就會知道它潛力無窮,幾乎能實現(xiàn)你想到的任何功能。然而,這種自由也讓你可能在不知不覺中做出對系統(tǒng)有害的操作。在本文中,我將介紹要避免哪些錯誤。初學者最常犯的錯誤包括:損壞SD
    的頭像 發(fā)表于 07-22 17:16 ?1346次閱讀
    避雷!樹莓派初學者常犯的5<b class='flag-5'>個</b><b class='flag-5'>錯誤</b>!

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

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

    深入理解C語言C語言循環(huán)控制

    C語言編程中,循環(huán)結構是至關重要的,它可以讓程序重復執(zhí)行特定的代碼塊,從而提高編程效率。然而,為了避免程序進入無限循環(huán),C
    的頭像 發(fā)表于 04-29 18:49 ?2068次閱讀
    深入理解<b class='flag-5'>C</b><b class='flag-5'>語言</b>:<b class='flag-5'>C</b><b class='flag-5'>語言</b>循環(huán)控制

    在工業(yè)自動化中使用固態(tài)繼電器時應避免的5錯誤

    固態(tài)繼電器(SSR)已成為工業(yè)自動化的無名英雄。它們安靜、可靠、速度快——這是繼電器應具備的所有特點。但就像高科技駕駛艙中的新手飛行員一樣,即使是經(jīng)驗豐富的工程師在使用SSR時也會常見錯誤。本文讓我們來看看應如何避免在工業(yè)自動化中使用固態(tài)繼電器時應避免的5
    的頭像 發(fā)表于 04-20 11:42 ?749次閱讀

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

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

    單片機C語言編程寶典大全,初學必備【強推下載!】

    資料介紹:包含 1. 51單片機入門教程 2. 初學者適用:單片機C語言實例100例(代碼及釋義) 3. 51單片機C語言快速上手 4. 5
    發(fā)表于 03-14 11:03