【寫給自己的開發知識樹】——十萬個問題

9.十萬個問題

9.1.定義局部變量而不初始化,其值爲什麼是隨機的?

因爲定義時相當於在棧上移動指針找到一塊沒人在用的空間給變量,但是棧是會被人反覆使用的(髒的),所以這塊空間上遺留着上次使用的內容。

9.2.結構體爲什麼要對齊訪問?

主要是爲了配合硬件,提高訪問效率。

9.3.爲什麼需要條件編譯?

有時候我們希望程序有多種配置,我們在編寫源代碼時寫好了各種配置的代碼,然後給個配置開關,在源代碼級別區修改配置開關來讓程序編譯出不同的效果。

9.4.爲什麼會有函數?

這是人的需要不是機器的需要。可以分化問題,易於分工,有利於程序的組織。

9.5.爲什麼需要回調函數

實現方:提供回調的地方
執行方:調用回調的地方
1、降低模塊耦合性(降低依賴性、關聯性),提高模塊獨立性,避免模塊之間你中有我我中有你。
2、異步回調,可以將耗時的操作隱藏在執行方,不影響實現方其它操作。SetTimer
3、多態效果,可以讓實現方,根據自己的需要定製執行方的不同形態;
例如功能模塊和業務模塊之間

9.6.Localhost、127.0.0.1、0.0.0.0有什麼區別

在IP協議中,0.0.0.0表示“本網絡中的本機”,而127.0.0.1則表示環回地址。如果用於Hosts文件,可以用localhost替代。
當需要多IP地址服務監聽的時候,使用0.0.0.0;而需要做迴環測試的時候則使用127.0.0.1。

9.7.32位爲什麼叫x86

x86指的是一種cpu的架構。基於32位cpu開發的操作系統就叫32位操作系統,因爲目前x86架構在32位cpu的知名度,32位操作系統也通常被稱爲x86系統。

9.8.什麼是嵌入式

嵌入式即嵌入式系統,是用於控制、監視或者輔助操作機器。

9.9.mcu、cpu、dsp有什麼區別?

MCU:單片機;將計算機的CPU、RAM、ROM、定時數器和多種I/O接口集成在一片芯片上,形成芯片級的計算機。
CPU:中央處理單元(Central Processing Unit)的縮寫,它可以被簡稱做微處理器(Microprocessor),用於計算。
DSP(digital signal processor)是一種獨特的微處理器,是以數字信號來處理大量信息的器件。

9.10.0、NULL強轉有什麼用

比如linux kernel下有鏈表定義LINK_NODE

typedef struct _LINK_NODE
{
	struct _LINK_NODE* prev;
	struct _LINK_NODE* next;
}LINK_NODE;

然後我們自定義的結構體如下,在只知道LINK_NODE的情況下,如何使用DATA_TYPE訪問value呢?
方法是head的地址減去head相當於結構體的偏移,就可以得到結構體的首地址,再強轉後就是DATA_TYPE了。

typedef struct _DATA_TYPE
{
	LINK_NODE head;
	int value;
}DATA_TYPE;
#define GET_DATA_ADDRESS(pNode, DATA, head) \
	(DATA*)((char*)(pNode) - (&((DATA*)(0))->head))

9.11.結構體最後定義char[0]有什麼用

typedef struct _DATA
{
	int len;
	char flage;
	int value;
	char a[0];
}DATA;

這個a可以用來實現可變長的結構體,用的時候malloc出來就可以了。其本身不佔內存空間,但是可以訪問。如果用其他方式比如char a[1]那就還得佔空間。

9.12.(void) (&min1 == &min2)的作用

在linux 內核中,這個起到警告的作用。如果兩個變量不是相同類型,進行==就會告警。

9.13 宏定義加括號的作用

例如:

#define min(x, y) ({				\
	typeof(x) _min1 = (x);			\
	typeof(y) _min2 = (y);			\
	(void) (&_min1 == &_min2);		\
	_min1 < _min2 ? _min1 : _min2; })

如果不加(),那這個宏定義只能作爲一條語句的方式使用:形如

單獨一行的min(1,2)[;]

在其他情況下都會編譯報錯:形如作爲參數、條件語句

ifmin(1,2){}
num = 1?min(2,3):4;
printf("%d\n", min(1,2));

9.14爲什麼C++中線程函數必須是static的

因爲C++中非static函數會默認加上一個參數——this,這樣就不符合線程函數的參數定義了。

9.15 爲什麼一直說C語言運行速度快

1、C語言不會進行內存泄漏、越界等檢查,少了步驟。
2、C語言編譯完成後生成機器碼,可直接被CPU識別運行,不需要通過虛擬機轉換。

9.16 C種什麼是聲明、定義

聲明:可以出現多次,用來說明這個變量定義了,但是在其他地方(如其他文件)。
定義:只能出現一次,確定變量的類型並分配內存

9.17 C用編譯器編譯,那用運行器運行嗎?

都知道編寫C程序,然後編譯成可執行文件,然後運行。那誰在運行呢?
這裏的運行器其實是shell+系統。shell會調用一個特殊的系統調用,根據可執行文件創建
新的進程、內存環境,然後系統就會去走到這個程序了,運行起來了。

9.18 爲什麼對數組名取地址後的值和數組名的值一樣

數組名的值 == 數組中第一個元素的地址
數組名取地址 == 整個數組的首地址
整個數組的首地址 == 數組首元素的地址
但是要注意的是,取地址後有個區別:
&數組名+1,會偏移掉整個數組

9.19 數組退化成指針是什麼意思

意思是數組名被編譯器當成指向數組第一個元素地址的指針。
這種情況只出現在數組作爲表達式或函數參數的時候。
數組聲明時的數組名就是地址不是指針。

9.20 linux 命令strings和cat的區別

cat會顯示文件的所有內容,包括看不懂的亂碼;
strings只會顯示看得懂的字符。
可以cat和strings一個可執行文件看看,就明白了

堅持積累

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章