天天看點

C/C++ 語言 零碎知識點的總結(1)幹貨

C/C++ 語言 零碎知識點的總結(1)

  在大學近三年的學習中,零零散散的遇到過較多的知識和問題,但時間過長之後也會有所遺忘,為了克服這個問題,想到可以用部落格來做記錄,友善模糊的時候回頭再學習。

首先,看代碼:
# include <stdio.h>
		
		int main(void){
		
			char side_a[] = "Side A";
			char dont[] = { 'w','o','w','!'};	
			char side_b[] = "Side B";
			
			puts(dont);
			return 0;
			
		}
           
C/C++ 語言 零碎知識點的總結(1)幹貨

  你是不是會對運作結果有點小驚訝呢,覺得使用 puts函數輸出的不應該是dont中的 “wow!” 字元串麼?為什麼還會有Side A呢,又為什麼不能是後面的Side B呢

  别擔心,部落客來為您解答。

  知識點1 :puts()函數解析:

  相信,此刻路過該博文的靓仔萌妹們,一定已經很熟悉puts()函數的正确使用了,不了解的話也沒關系嘛,部落客很細心的哈,已附上學習連結。

  1. puts()函數百度百科

  2. C語言puts()函數用法詳解

  我們重回話題,沒錯,puts()函數最重要的一個點就是,puts函數是遇到結束符 “\0” 才會結束的,否則,計算機會在記憶體中向下尋找,直到遇到空字元才結束,是以,沒有結束标志的話,puts函數可能會輸出亂碼來。

  知識點2 :C/C++ 各變量存儲的區域不同。

  C/C++程式中各變量在記憶體中的存儲區域:

  1. 記憶體棧區:存放局部變量名

  2. 記憶體堆區:存放new或malloc出來的對象;

  3. 常數區:存放局部變量或者全局變量的值;

  4. 靜态區:用于存放全局變量或者靜态變量;

  5. 代碼區:二進制代碼。

  此外,C/C++是沒有垃圾回收機制的,是以,需及時的對堆資料進行銷毀回收,以防止記憶體洩露,就是我們熟悉的free()和delete()函數啦,而棧記憶體是動态釋放的。

  好了,可愛的你通過如上的簡單介紹後,一定已經猜到該代碼運作結果的原因了,哈哈哈,讓我一同揭曉謎底。
C/C++ 語言 零碎知識點的總結(1)幹貨
  首先,申明的均是局部變量,是以均在記憶體棧中配置設定的空間。而dont數組中是沒有字元串結束符 ‘\0’ 的,是以,在使用puts()函數後就會在記憶體棧中就近向後尋找包含結束符 '\0’的字元串,一并輸出。
  又因side_a變量先于dont變量入棧,是以side_a位于dont之後,指針 p 向後查詢到side_a時剛好有結束符 ‘\0’,是以puts()函數運作到side_a的時候也才算真正的結束。
  好了,博文也算斷斷續續的總結完了,今天也是除夕,就祝大家新春快樂,“牛”轉乾坤吧!!