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

C語言中sizeof與strlen 的區別

字符指針 系統 32位 大小 添加 std 指針 為什麽 一行

sizeof與strlen是有著本質的區別,sizeof是求數據類型所占的空間大小,而strlen是求字符串的長度,字符串以/0結尾。總的來說sizeof把‘\0‘也給數上了,而strlen遇到‘\0‘就停止計數了。
區別如下:
(1) sizeof是一個C語言中的一個單目運算符,而strlen是一個函數,用來計算字符串的長度。
(2)sizeof求的是數據類型所占空間的大小,而strlen是求字符串的長度
實例1:
printf("char=%d/n",sizeof(char)); //1
printf("char=%d/n",sizeof(char)); //4
printf("int=%d/n",sizeof(int)); //4
printf("int=%d/n",sizeof(int)); //4
printf("long=%d/n",sizeof(long)); //4
printf("long=%d/n",sizeof(long)); //4
printf("double=%d/n",sizeof(double)); //8
printf("double=%d/n",sizeof(double)); //4

可以看到,char占1個字節,int占4個字節,long點4個字節,而double占8個字節。但 char,int,long,double都占4個字節的空間。

這是為什麽呢?
在C語言中,char,int,long,double這些基本數據類型的長度是由編譯器本身決定的。而char,int,long,double這些都是指針,回想一下,指針就是地址呀,所以裏面放的都是地址,而地址的長度當前是由地址總線的位數決定的,現在的計算機一般都是32位的地址總線,也就占4個字節。

實例2:
char a[]="hello";
char b[]={‘h‘,‘e‘,‘l‘,‘l‘,‘o‘};
strlen(a),strlen(b)的值分別是多少?

前面分析過,strlen是求字符串的長度,字符串有個默認的結束符/0,這個結束符是在定義字符串的時候系統自動加上去的,就像定義數組a一樣。數組a定義了一個字符串,數組b定義了一個字符數組。因此,strlen(a)=5,而strlen(b)的長度就不確定的,因為strlen找不到結束符,它的結果會給一個隨機值。

下面是一個比較經典的例子,分析一下:

char *c="abcdef";
char d[]="abcdef";
char e[]={‘a‘,‘b‘,‘c‘,‘d‘,‘e‘,‘f‘};

printf("%d%d/n",sizeof(c),strlen(c)); ==>4 6 這裏的4是char*c占的空間
printf("%d%d/n",sizeof(d),strlen(d)); ==>7 6 這裏的7是因為 sizeof把‘\0‘也給數了
printf("%d%d/n",sizeof(e),strlen(e)); ==>6 14 因為沒有遇到‘\0‘,strlen根本沒停下
分析一下:
第一行定義c為一個字符指針變量,指向常量字符串,c裏面存放的是字符串的首地址。
第二行定義d為一個字符數組,以字符串的形式給這個字符數組賦值。
第三行定義的也是個字符數組,以單個元素的形式賦值。

當以字符串賦值時,"abcdef",結尾自動加一個"/0".
strlen(c)遇到/0就會結束,求的是字符串的長度,為6.
sizeof(c)求的是類型空間大小,在前面說過,指針型所點的空間大小是4個字節,系統地址總線長度為32位時。

strlen(d)也是一樣,字符串賦值,自動添加/0,求字符串的長度當然是6.
sizeof(d)是求這個數組所占空間的大小,即數組所占內存空間的字節數,應該為7.

sizeof(e), 數組e以單個元素賦值,沒有/0結束符,所以所占空間的大小為6個字節。
strlen(e),去找/0結尾的字符串的長度,由於找不到/0,所以返回的值是一個不確定的值。
插一個我寫的程序
逆置一個字符串
非遞歸
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
void reverse_string(char*str, int len)
{
int left = 0;
int right = len;
char tmp = 0;
while (left <= right)
{
tmp= str[left];
str[left] =str[right];
str[right]=tmp;
left++;
right--;
}
}
int main()
{
char str[] = "abcdef";
int len = sizeof(str) / sizeof(str[0]) - 2;
//這裏本來想著是減一,結果老是運行不出來,因為sizeof(str) 它的結果是7,而不是6
reverse_string(str, len);
printf("%s\n", str);
system("pause");
return 0;
}

C語言中sizeof與strlen 的區別