關於 sizeof 和 strlen 的各種情況

2021-10-03 18:34:44 字數 3238 閱讀 3041

#include

#include

#include

intmain()

;printf

("%d\n"

,sizeof

(a))

;//16

printf

("%d\n"

,sizeof

(a +0)

);//4,a已經隱式轉換為指標int*

printf

("%d\n"

,sizeof

(*a));

//4,a已經隱式轉換為int*再解引用得到int

printf

("%d\n"

,sizeof

(a+1))

;//4,a已經隱式轉換為指標int*再+1還是int*

printf

("%d\n"

,sizeof

(a[1])

);//4,a[1]= *(a+1)還是指標int*

printf

("%d\n"

,sizeof

(&a));

//4,&a是乙個陣列指標int(*)[4]

printf

("%d\n"

,sizeof(*

&a))

;//16,&a是陣列指標,再次解引用從這個位址開始取int(*)[4]型別對應的的位元組

printf

("%d\n"

,sizeof

(&a+1)

);//4,陣列指標+1還是指標

printf

("%d\n"

,sizeof

(&a[0]

));//4,得到int*

printf

("%d\n"

,sizeof

(&a[0]

+1))

;//4,指標+1還是int*

return0;

}int

main()

;printf

("%d\n"

,sizeof

(arr));

//6,arr是字元陣列

printf

("%d\n"

,sizeof

(arr+0)

);//4,得到乙個char*

printf

("%d\n"

,sizeof

(*arr));

//1,得到乙個char

printf

("%d\n"

,sizeof

(arr[1]

));//1,得到乙個char

printf

("%d\n"

,sizeof

(&arr));

//4,得到乙個陣列指標char(*)[6]

printf

("%d\n"

,sizeof

(&arr+1)

);//4,陣列指標+1還是指標

printf

("%d\n"

,sizeof

(&arr[0]

+1))

;//4,&arr[0]得到乙個char*,+1還是指標

printf

("%d\n"

,strlen

(arr));

//針對乙個不是字串的字元陣列進行strlen操作,未定義行為

printf

("%d\n"

,strlen

(arr+0)

);printf

("%d\n"

,strlen

(*arr));

//*arr得到的是'a'=>97,strlen就把97當成了乙個位址,計算機上對應的97的位址,大概率無法訪問。

printf

("%d\n"

,strlen

(arr[1]

));printf

("%d\n"

,strlen

(&arr));

printf

("%d\n"

,strlen

(&arr+1)

);printf

("%d\n"

,strlen

(&arr[0]

+1))

;return0;

}int

main()

intmain()

intmain()

;//所謂二維陣列,本質是乙個一維陣列,裡面的每個元素又是乙個一維陣列

printf

("%d\n"

,sizeof

(a))

;//48,12個元素,每個元素4個位元組

printf

("%d\n"

,sizeof

(a[0][

0]))

;//4

printf

("%d\n"

,sizeof

(a[0])

);//16,a[0]=>int[4]

printf

("%d\n"

,sizeof

(a[0]+

1));

//4,a[0]=>int[4]再+1,就隱式轉換成指標int*

printf

("%d\n"

,sizeof(*

(a[0]+

1)))

;//4,int*解引用得到int,*(a[0]+1)=>a[0][1]

printf

("%d\n"

,sizeof

(&a[0]

+1))

;//4,a[0]=int[4],&a[0]=>int(*)[4],再+1還是指標

printf

("%d\n"

,sizeof(*

(&a[0]

+1))

);//16,上面解引用得到int[4]

printf

("%d\n"

,sizeof

(*a));

//16,*a=>*(a+0)=>a[0],得到int[4]

printf

("%d\n"

,sizeof

(a[3])

);//16,sizeof是乙個運算子,特點是編譯期求值

//「陣列下標越界未定義行為」前提條件是記憶體訪問越界,這是程式執行時的行為

return0;

}

關於strlen和sizeof的陷阱

一,strlen是乙個庫函式,計算指定的字串包含的字元個數,要求輸入的串必須以 0 結束,但計算的字元個數不包含 0 本身。例子 1,char sztest 100 注意這裡還沒進行初始化,裡面的資料是隨機的 strlen sztest 此時輸出的資料取決於陣列sztest裡面的 0 在什麼位置結束...

關於sizeof 和 strlen深坑全解析

大家都知道,sizeof和strlen可以用來獲取大小,但是有著不同的用法,這裡首先總結區別,最後根據sizeof 和 strlen 的具體事例來分析特別需要注意的事項。1.sizeofsizeof是操作符,strlen是函式。操作符的結果型別是size t,它在標頭檔案中typedef為unsig...

sizeof和strlen和 countof的區別

運算子,計算引數所佔記憶體 int nnum2 strlen arr 是函式,求字元的個數,不包括 0 int nnum3 countof arr windows巨集 計算陣列的元素個數 cout nnum1 cout nnum2 cout nnum3 endl int arr1 20 nnum1 ...