該例子說明幾個問題:
1. sizeof操作符與strlen函數比較 strlen()計算字符串中字符的個數(arry[] = "hello"),不包括'\0'字符。 sizeof計算數據(包括數組、變量、類型、結構體等)所占內存空間的字節數。 2. 指針與靜態數組的sizeof操作 指針均可看為變量類型的一種。所有指針變量的sizeof 操作結果均為4。 例:int *p; sizeof(p) = 4; 但sizeof(*p)相當於sizeof(int); 對於靜態數組,sizeof可直接計算數組大小; 例:int a[10]; char b[] = "hello"; sizeof(a) = 4 * 10 = 40; sizeof(b) = 6; 數組做型參時,數組名稱當作指針使用! 例:void fun(char arry) sizeof(arry) = 4 3. 格式的寫法 sizeof操作符,對變量或對象可以不加括號,但若是類型,須加括號。推薦都加括號 4. union與struct的空間計算 總體上遵循兩個原則: (1)整體空間是占用空間最大的成員(的類型)所占字節數的整倍數。 (2)數據對齊原則----內存按結構成員的先後順序排列,當排到該成員變量時, 其前面已擺放的空間大小必須是該成員類型大小的整倍數,如果不夠則 補齊,以此向後類推。 注意:數組按照單個變量一個一個的擺放,而不是看成整體。 如果成員中有自定義的類、結構體,也要注意數組問題。 對齊問題使結構體的sizeof變得比較復雜。#include <stdio.h>#include <string.h> // 包含strcpy函數/******************************************************************** sizeof(p) = 4 sizeof(*p) = 4 strlen(b) = 5 sizeof(arry) = 4 sizeof(a) = 40 sizeof(b) = 6 Press any key to continue ********************************************************************/
void f(char arry[]){ printf("sizeof(arry) = %d\n", sizeof(arry));}
int main(void){ int *p = NULL; int a[10] = {0}; char b[] = "hello";
printf("sizeof(p) = %d\n", sizeof(p)); // 所有指針變量的sizeof 操作結果均為4。 printf("sizeof(*p) = %d\n", sizeof(*p)); // 相當於sizeof(int);
printf("strlen(b) = %d\n", strlen(b)); // 計算字符串"hello"長度,不包括'\0'字符。
f(b); // 數組做型參時,數組名稱當作指針使用!
printf("sizeof(a) = %d\n", sizeof(a)); // 4 * 10 = 40 printf("sizeof(b) = %d\n", sizeof(b)); // 6 * 1 = 6
return 0;}
輸出結果:16 分析:\n 和 \r 各占一個字節,字符串最後有一個\0,也占一個字節。所以,總共16個字節。  #include <stdio.h>
#include <string.h>
void main()
{
unsigned char TxBuffer[] = "\n\rhello world\n\r";
printf("%d\n", sizeof(TxBuffer));
}