int mian(void)
//"hello world",多位元組字串,字元佔空間大小不一樣
//l"hello world",unicode編碼,每個字元都是佔相同編碼,核心採用這種
//_t("***x"),自適應,取決於專案的巨集。
//'a',char,asic,乙個位元組
//l'a'wchar_t,unicode,windows兩個位元組,linux四個位元組
'0',0,'\0',"0",null,nullptr,
第乙個是字元0,值是48,第二個整數0,第三個值是0,是字串結尾的0,第四個是字串,其實是"0\0",
c:#define null (void*)0
c++:
#define null 0
null指標空,nullptr是c++的空,c++11後的標準。
c++不允許直接將void*隱式轉化為其他型別,比如null被定義成(void*)0
但當編譯char *p=null,就會編譯出錯,比如產生二義性,如在c++有函式過載
void func(int)和void func(char*),呼叫得的第乙個,不合理,所以引入nullptr,區分0和null。
nullptr的型別為nullptr_t,不是整數型別,能夠隱式轉換為任何指標。所以空指標推薦使用nullptr。
比如上面兩個函式傳入引數0和nullptr就可以分開了。
100,4位元組,int,long
100i64,64位整數8個位元組。_int64,long long
char 是unsigned char/signed char由編譯器覺得,比如在vc是有符號。
除錯的基本手段
%c是char,%wc%c是wchar,%hd是short,%ld是long,%i64d是_int64八個位元組,%lldlong long或者_int64。%u是無符號整數,%x16進製制,%o8進製檔案屬性,%p指標,%f是float但進度浮點數,%lf雙精度,%z是ansi_string,%wz unicode_string,在驅動中,以長度結尾,其實是個結構體,%n被禁用,%%轉義字元列印百分號,%02x列印2位16進製制數,不夠用0填充,一般是md5值,
%.2f保留浮點數後2位
printf("hello world");
printf("%s","hello world");如果寫死引數,這兩個是一樣的,
如果是引數比如buf,就是第二種好,會造成格式化串溢位漏洞,比如給的是("%s,%d,%n,%x");
第乙個就會理解為變參函式按著這種格式列印棧上的資料。會產生安全漏洞。中間的%n還能修改資料。%n是前面字串子樹的個數。
sizeof是個關鍵字,在編譯時候就確定了,函式大部分是執行的時候確定的。
計算結構體對齊的時候,要自然對齊,目的是提高cpu速度
1.每個個成員存放在記憶體是自身大小的整數倍。比如char是任意,short就是偶數的位址。long就是4的倍數的位址。
2.必須是最大成員的整數倍
另外還可以加#pragma pack(n)指定對齊粒度
棧對齊就是x86是4位元組,float,double8位元組,x64都是16位元組對齊,形參部分入棧是8位元組入棧,對齊
4. 分析下列程式中每個變數的儲存位置,作用域,與生命週期.
int a = 0;
char *p1;
static int x = 10;
int main(void)
int b = 0;
char s1 = "123";
char *p2;
char *s2 = "123";
static int c =0;
p1 = (char *)malloc(128);
p2 = (char *)malloc(256);
free(p1);
free(p2);
return 0;
變數型別
變數儲存空間
變數作用範圍
變數生命週期
a全域性初始化變數
.data
整個工程
程式執行週期
p1全域性未初始化變數
.bss 是0
整個工程
程式執行週期
x全域性靜態變數
.data
當前文件(避免命名衝突)
程式執行週期
b區域性變數
棧
函式內部
函式執行週期
s1區域性變數
棧
函式內部
函式執行週期
p2區域性變數
棧
函式內部
函式執行週期
s2區域性變數
棧函式內部
函式執行週期
c靜態區域性變數
.data
函式內部
程式執行週期
靜態區.data:全域性初始化的變數,編譯時候就確定了,並將其編譯進了可執行檔案,經過反彙編能找到。可以使exe膨脹。
.bss:全域性未初始化變數,執行時候手動編寫彙編**將其初始化,不佔實際磁碟空間,只在段表記錄大小,符號表記錄符號。檔案載入執行時,才分配空間
.rdata:全域性唯讀,同理.data。
只有乙份123,把rdata的值拷貝到棧上。
全域性變數同乙個檔案中先定義先初始化,不同不確定
①(char)(127<<1)+1=
127是4位元組,右移一位,強轉char就是截斷,然後加1,因為1是4位元組整型,又要擴充(用符號位擴充)
127四位元組:00 00 00 7f
左移一位 00 00 01 fe
所以 char強制轉化之後就是 fe 二進位制11111110
加1,會強制轉化為大的,補符號位,11111110符號1所以**1全部是32個1,所以是-1;
②(char)(-1>>1)+1=
-1是32個1,右移,這裡是算術右移,符號填充(邏輯才是0填充)
加1就是0
③1<<2+3=
考點優先順序,相當於1<<5
④(15&240)+((2^100)%7)=2(此處2^100表示2的100次方)
15&240=0;2^100=2*2^99=2*(2^3)^33=2*(8)^33=2(1+7)^33=2(1^33+1^32*7++2^31*7^2。。。。)二項式展開,後面都有7,只有第一項沒有所以最後是2
⑤(char)(-128*-1)=-128
1位元組有符號數是-128到127,整數上溢變最小數,下溢最大數。
⑥(2018^2018)+(20180818^0)=20180818
⑦1^2^4^5^6...^1024=(即整數從1到1024,除了3之外所有數的異或)
1異或到n,結果是n,所以如果異或加上3,是1024.
(1^2^3...^x...^1024)^x=1^2^3^....^1024(中間少個異或x)
所以結果為1024^3=1027
⑧(0x12345678>>24)&0xff=
(0x12345678>>24)=0x12&0xff=
0x12
⑨ 0x12345678 | ~0xfffeffff =
~0xfffeffff =0x00010000
0x12345678 |0x00010000=0x12355678
⑩假如36進製的規則為「0123456789abcdefghijklmnopqrstuvwxyz」。 比如常見10進製與36進製對應關係: 1=「1」,10=「a」,20=「k」,35=「z」,36=「10」 。 那麼10進製128對應的36進製為:
3kx86是低位優先
任何數與他自己減1相與就是將其最右邊的1置0
可以用來統計乙個數中有多少個二進位制的1
void fun(char c)
printf("%d\n" , sizeof(c));
void fun2(char &c)
printf("%d\n" , sizeof(c));
void fun3(char(&c)[9]) //陣列的引用,所以就是陣列的長度,所以必須傳長度正確的輸出,這裡就是9
printf("%d\n" , sizeof(c));
int main()
char c = "12345678";
printf("%d\n" , sizeof(c));//①
fun(c);//②
fun2(*c);//③
fun3(c);// ④
return 0;
按照程式執行順序輸出結果為:
①:9②:4//陣列作為形參傳入函式,會退化為指標。
③:1傳的字元的引用,*c就是字元1
④:9
django flask的一些小點
1.django中路由有path和re path兩種 通過re path傳參也有命名匹配和分組命名匹配兩種 分組匹配 re path r index d v iews ind ex 分 組命名匹 配rep ath r da te p ar 0 9 4 p nt h 0 9 2 views.index...
recyclerview使用時的一些小點
解決 padding不隨著滑動的情況 android cliptopadding false 解決鑲嵌 scollview滑動不流暢問題 myrecylinearlayout layout new myrecylinearlayout getactivity layout.setsmoothscro...
C語言筆記 一些小細節
2.char ex 5 4 scanf s ex 無需取位址符 因為字元陣列本身是指標。3.12s中 表示向左對齊 預設向右對齊 12 表示佔12個位元組。4.定義乙個陣列,比如char ex n n應為恒量,如 define n 5 或const int n 5 5.不支援字元陣列的直接賦值,需要...