1. 程式人生 > >C語言中sizeof()和strlen()的區別

C語言中sizeof()和strlen()的區別

《sizeof》

(一)、sizeof的基本概念

sizeof操作符以位元組形式給出了其運算元的儲存大小。運算元可以是一個表示式或括在括號
內的型別名。運算元的儲存大小由運算元的型別決定。

(二)使用方法

1、用於資料型別

sizeof使用形式:sizeof(type) ,如sizeof(int)

2、用於變數

sizeof使用形式:sizeof(var_name)或sizeof var_name

變數名可以不用括號括住。如sizeof (var_name),sizeof var_name等都是正確形式。帶上括號的用法更普遍。建議像我們初學的小白們大家都帶上括號比較好。嘻嘻!!!
注意:sizeof操作符不能用於函式型別,不完全型別或位欄位。不完全型別指具有未知儲存大小的資料型別,如未知儲存大小的陣列型別、未知內容的結構或聯合型別、void型別等。
如sizeof(max)若此時變數max定義為int max(),sizeof(char_v) 若此時char_v定義為char char_v [MAX]且MAX未知,sizeof(void)都不是正確形式。

(三)、常用型別的對齊方式

型別 對齊方式(變數存放的起始地址相對於結構的起始地址的偏移量)
char 偏移量必須為sizeof(char)即1的倍數
int 偏移量必須為sizeof(int)即4的倍數
double 偏移量必須為sizeof(int)即4的倍數
short 偏移量必須為sizeof(short)即2的倍數
float 偏移量必須為sizeof(float)即4的倍數

(四)、sizeof用法總結

1. 引數為資料型別或者為一般變數。

例如sizeof(int),sizeof(long)等等。這種情況要注意的是不同系統系統或者不同編譯器得到的結果可能是不同的。例如int型別在16位系統中佔2個位元組,在32位系統中佔4個位元組,在64位系統中佔8個位元組。

2. 引數為陣列或指標

下面舉例說明.

int a[50];         //sizeof(a)=4*50=200; 求陣列所佔的空間大小

int *a = new int[50]; // sizeof(a)=4; a為一個指標,sizeof(a)是求指標的大小,在32位系統中,當然是佔4個位元組。

小祕訣:sizeof(陣列名):求取的是陣列的整體大小哦

&陣列名:求取的是陣列的整體大小哦

其他情況均為陣列首元素的地址

《strlen》

C庫函式 size_t strlen(const char *str) 計算字串str的長度,但不包括終止空字元

1、宣告

以下是宣告的strlen() 函式。

size_t strlen(const char *str)

2、引數

str – 這是字串的長度要計算的

3、返回值

這個函式返回字串的長度。

例子

下面的例子顯示使用strlen() 函式。

#include <stdio.h>
#include <string.h>

int main ()
{
  char str[50];
  int len;

  strcpy(str, "guozhaozhao");

  len = strlen(str);
  printf("Length of |%s| is |%d|", str, len);

  return(0);
}

這裡寫圖片描述

例題解析

字元陣列例題

#inlcude<stdio.h>
#include <string.h>
int main()
{   
    char *p = "abcdef";//字串
    char arr1[] = "abcdef";//字串
    char arr2[] = {'a','b','c','d','e','f'};//6個字元。沒有\0
    printf("%d\n",sizeof(p));//結果為:4  p為一個指標變數,所有型別的指標的大小都是四個位元組。(32系統)
    printf("%d\n",sizeof(arr1));//結果為:7 arr1為陣列名,放進去求的是陣列的總大小。記住arr1中的字串還包含有\o。
    printf("%d\n",sizeof(arr2));//結果為:6
    printf("%d\n",strlen(p));//結果為:6  \0不統計
    printf("%d\n",strlen(arr1));//結果為:6 \0不統計
    printf("%d\n",strlen(arr2));//結果為:沒有\0 是一個隨機值
    return 0;
}
#inlcude<stdio.h>
#include <string.h>
int main()
{   
    char *p = "abcdef0\0";//字串
    char arr1[] = "abcdef0\0";//字串
    char arr2[] = {'a','b','c','d','e','f','0','\0'};
    printf("%d\n",sizeof(p));//結果為:4  
    printf("%d\n",sizeof(arr1));//結果為:9 
    printf("%d\n",sizeof(arr2));//結果為:8
    printf("%d\n",strlen(p));//結果為:7 
    printf("%d\n",strlen(arr1));//結果為:7 
    printf("%d\n",strlen(arr2));//結果為:7
    return 0;
}

一維陣列的例題

#inlcude<stdio.h>
#include <string.h>
int main()
{
    int a[] = {1,2,3,4};
    printf("%d\n",sizeof(a));//結果為:16 放的四個整型所以是4*4=16。
    printf("%d\n",sizeof(a+0));//結果為:4 第一個元素的地址。
    printf("%d\n",sizeof(*a));//結果為:4 第一個元素
    printf("%d\n",sizeof(a+1));//結果為:4 第二個元素的地址。
    printf("%d\n",sizeof(a[1]));//結果為:4 第二個元素。
    printf("%d\n",sizeof(&a));//結果為:4 陣列的地址。
    printf("%d\n",sizeof(&a+1));//結果為:4 陣列末尾再後面空間的地址。
    printf("%d\n",sizeof(&a[0]));//結果為:4 第一個元素的地址。
    printf("%d\n",sizeof(&a[0]+1));//結果為:4 第二個元素的地址。
    printf("%d\n",sizeof(*&a));//結果為:16 &a取出來的是整個陣列的地址,對陣列的地址進行* 就成了整個陣列了。
    return 0;
}

二維陣列的例題

#include<stdio.h>
#include<string.h>
int main()
{ 

    int a[3][4] = {0};          
    printf("%d\n",sizeof(a));   //48       整個二維陣列的大小
    printf("%d\n",sizeof(a[0][0])); //4    下標為a[0][0]的長度,也就是第一行第一個元素的大小
    printf("%d\n",sizeof(a[0]));    //16   第1行的大小 第一行有四個每個又為整型 所以為16
    printf("%d\n",sizeof(a[0]+1));  //4    第一行第二個元素的地址   
    printf("%d\n",sizeof(a+1));     //4    第二行的地址   
    printf("%d\n",sizeof(&a[0]+1)); //4 第1行的地址的長度       
    printf("%d\n",sizeof(*a));      //16     第0行的長度
    printf("%d\n",sizeof(a[3]));    //16     越界了但是還是會計算出第三行的長度。
    return 0;
}