一起學習C/C++ (7) 分辨sizeof和strlen

2021-03-02 信息學競賽

接下來我們來說說sizeof和strlen。

1.sizeof

函數or關鍵字?

對於sizeof,第一點我們要清楚的是,它是一個關鍵字,並不是一個函數。正因為sizeof不是函數,因此我們不把它所要求得長度的對象叫做參數,這也是

sizeof不能求得void類型的長度 
你無法求出sizeof(void),其實你是無法聲明出void的一個變量的,void指的是一個空類型,空類型你是無法知道變量內存空間大小的,所以你用sizeof去求肯定是不行的。

sizeof可以求void類型指針的長度 
sizeof對於void類型的指針,因為指針,是用來存放地址的變量,在32位平臺,所有版本的編譯器都把它看作4個字節,所以你後續只要用sizeof求的是指針,就絕對是4。

sizeof能求得靜態分配內存的數組的長度 
這個其實很好解釋,例如:

#include<stdio.h>#include<stdlib.h>int main(){    int arr[] = { 1, 2, 3, 4 };    printf("%d", sizeof(arr));    system("pause");    return 0;}

在這裡你可以看到這裡的sizeof=類型所佔字節大小*元素個數。

void lab(int arr[4]){         
   int m = sizeof(arr);        
    printf("%d",m);}

在這裡的m就是一個陷阱的提現,如果你說結果m是16,那麼你就錯了,當數組做形參時,所傳遞的並不是數組本身,在這裡數組被轉化成了指針,因為如果數組太大了,如果你要傳數組,那麼所需要創建的拷貝就很大,這樣會導致效率很低。所以其實你進行的還是對指針的sizeof,結果依然是4。

2.strlen

strlen()函數,它是一個字符串函數,它相當於一個計數器,當它遇到』\0』時就停止計數。 
strlen的實現:

int my_strlen(const char *str){    
   int len=0;    
   assert(str != NULL);    
   while ((*str++) != '/0') {        
               len++;  
   }    
   return len;
}

strlen函數是遇到『/0』就會停止。

3. 關於strlen和sizeof的示例:
#include<stdio.h>

#include<stdlib.h>

#include<string.h>

int main(){    
char *p = "abcdef0\0";    
char arr1[] = "abcdef";    
char arr2[] = { 'a', 'b', 'c','d', 'e', 'f' };    
int a[] = { 1, 2, 3, 4 };    
printf("%d\n",sizeof(p));
   
printf("%d\n",sizeof(arr1));    
printf("%d\n",sizeof(arr2));    
printf("%d\n",strlen(p));    
printf("%d\n",strlen(arr1));    
printf("%d\n",strlen(arr2));    
printf("%d\n",sizeof(a));    
printf("%d\n",sizeof(a+0));    
printf("%d\n",sizeof(*a));    
printf("%d\n",sizeof(a+1));    
printf("%d\n",sizeof(a[1]));    printf("%d\n",sizeof(&a));    
printf("%d\n",sizeof(&a+1));    printf("%d\n",sizeof(&a[0]));    
printf("%d\n",sizeof(&a[0]+1));    printf("%d\n",sizeof(*&a));    
char name[] = "abcdef";    printf("%d\n", sizeof(name[0]));    printf("%d\n", sizeof(&name));    
printf("%d\n", sizeof(*name));    printf("%d\n", sizeof(&name + 1));    
printf("%d\n", sizeof(name + 1));    printf("%d\n", sizeof(name));    
printf("%d\n", strlen(name));    printf("%d\n", strlen(&name));    
printf("%d\n", strlen(&name + 1));    printf("%d\n", strlen(name + 1));    
char *name = "abcdef";    printf("%d\n", sizeof(name[0]));    printf("%d\n", sizeof(&name));    
printf("%d\n", sizeof(*name));    printf("%d\n", sizeof(&name + 1));    
printf("%d\n", sizeof(name + 1));    printf("%d\n", sizeof(name));    
printf("%d\n", strlen(name));    printf("%d\n", strlen(&name));    
printf("%d\n", strlen(&name + 1));    printf("%d\n", strlen(name + 1));  
system("pause");  
 return 0;}

運行結果:

相關焦點

  • 一文帶你了解c++和c中字符串的使用
    說完了c,那麼對於我們的c++來說,它定義字符串就簡單多了,因為有關鍵字來定義,你一看就知道。那麼下面大家就隨著我的筆步一起來看看究竟吧!有可能有些網友還沒怎麼接觸到c++(c++它是一門面向對象的語言,而c是一門面向過程的語言,所以這裡可能沒接觸過那個面向對象的網友不習慣這個用法,不過還是建議至少要掌握一門面向對象的語言,在這個發展快速的時代,不能太固步自封了(我這裡也是簡單的介紹一下c++中的字符串,不會設計到類和對象什麼的,只是和c語言做個對比)。)1、什麼是字符串?
  • C語言中sizeof和strlen的區別是什麼
    C語言中sizeof和strlen的區別是:strlen是一個函數,用來計算指定字符串str的長度,但不包括結束字符(即null字符);而sizeof
  • C/C++基礎之sizeof使用
    由於它們的內存大小是和系統相關的,所以在不同的系統下取值可能不同。;   //輸出20    cout<<sizeof(A[0][0])<<endl;//輸出4    cout<<sizeof(c)<<endl;      //輸出7    cout<<sizeof(d)<<endl;      //輸出4    cout<<sizeof(*d)<
  • 實例分析C語言中strlen和sizeof的區別
    操作符返回的是參數所佔的內存數,而 strlen函數返回的是參數的字符串長度,不是所佔用的內存的大小。需要注意的是,strlen函數的參數是字符串,並且必須以串結束符「\0」結尾。看看下面的代碼。author: 衝哥 * @date: 2020/12/13 18:12 * @description: */#include<stdio.h>#include<string.h>int main(){    char str[10] = "hello";    printf("字符串的長度為:%d\n", strlen
  • 經典C語言面試題:sizeof與strlen的區別
    strlen只關心存儲的數據內容,不關心空間的大小和類型。3.sizeof可以用類型做參數,strlen只能用char*做參數,且必須是以''\0''結尾的。 sizeof還可以用函數做參數,比如: short f(); printf("%d\n", sizeof(f())); 輸出的結果是sizeof(short),即2。
  • C/C++刁鑽問題各個擊破之細說sizeof
    概述:Sizeof是C/C++中的關鍵字,它是一個運算符,其作用是取得一個對象(數據類型或者數據對象)的長度(即佔用內存的大小,以byte為單位)。其中類型包含基本數據類型(不包括void)、用戶自定義類型(結構體、類)、函數類型。數據對象是指用前面提到的類型定義的普通變量和指針變量(包含void指針)。不同類型
  • c++ 之布爾類型和引用的學習總結!
    root@txp:/home/txp# gcc test.ctest.c: In function 『main』:test.c:7:21: error: lvalue required as left operand of assignment    ( a < b) ?
  • sizeof/strlen—字符數組/字符串的長度你真的懂嗎?附代碼
    數據類型的長度本文將對各種數據類型的變量長度做詳細介紹,以供大家參考、學習。求基本數據變量類型的長度—sizeof基本數據類型的長度:布爾:bool字符:char整數結果重點:字符數組與字符串所佔的字節長度這是一個很容易混淆的點,字符串與字符數組,sizeof
  • c語言指針與字符數組
    c[0] = 'h'; c[1] = 'e'; c[2] = 'l'; c[3] = 'l'; c[4] = 'o'; c[5] = '\0'; printf("char = %s\nsizeof(c) = %d\n",c,sizeof(
  • C語言中的字符串操作函數
    作者:守望,Linux應用開發者,目前在公眾號【編程珠璣】 分享Linux/C/C++/數據結構與算法/工具等原創技術文章和學習資源
  • C語言結構體之sizeof與strlen用法詳解
    3.結構體大小對齊規則:結構體大小也就是sizeof的結果,必須是其內部成員中最大的對齊參數的整數倍,不足的要補齊。struct node{    char  b;    int   a;    short c;};上面結構體sizeof(struct node)=16,這是在32位系統中。
  • 【C進階】拿著"sizeof這些用法和坑"去吹牛吧!
    Fuction: sizeof簡單測試  6 * Author:   (公眾號:最後一個bug)  7 **************************************/ 8int main(int argc, char *argv[]) { 9    int a = 5; 10    printf("sizeof(char)= %d\n",sizeof
  • 10個C語言字符串實例
    ,*p);    }int main(){    reverse("abcdefghjklmn");//為4    printf("%d",sizeof("abc"));//為3         printf("%d",strlen("abc"));    printf("\n");    return 0;
  • c語言中的字符串操作函數
    答案是第一行定以後,作業系統給它分配的是棧區內存,而第二行通過指針形式來定義字符串的話,它分配的內存區在數據的常量區,意味著它的值是不可更改的:str1[0] = 'm';  //正確,字符數組可以修改str2[0] = 'm'; //錯誤,常量區不可修改所以,在常量區,如果我們兩個內容相同但變量不同的指針變量
  • 面試:C/C++常見庫函數實現
    size_t n);void* memset(void* src,int c,size_t n){    assert(src != NULL);    char* psrc = (char*)src;    while(n--){        *psrc++ = (char)c;    }    return src;}3、char* strcpy(char* dest,const char* src);
  • C 2 C++進階篇(1)
    首先談談筆者的水平,只學過c和數據結構,接觸過指針,對於取地址&從來沒有接觸過(因為據說是老師說不符合嚴謹的c....), python
  • 蠕蟲C語言代碼
    strncmp(email+c,".hlp",4)) continue; if (!strncmp(email+c,".gov",4)) continue; for (pos=c,d=0;pos<strlen(email);pos++) if (!
  • 通俗易懂地告訴你,java語言中為什麼沒有sizeof操作符
    01sizeof()定義sizeof是c語言的一種單目操作符,如c語言的其他操作符++、--等。它並不是函數。sizeof操作符以字節形式給出了其操作數的存儲大小。操作數可以是一個表達式或括在括號內的類型名。操作數的存儲大小由操作數的類型決定。
  • c++之重載函數學習總結
    c++中通過函數名和函數參數確定函數調用二、重載函數進階學習1、重載與指針:下面的函數指針將保存哪個函數的地址?相互調用:實際工程中C++和c代碼相互調用是不可避免的c++編譯器能夠兼容c語言的編譯方式c++編譯器會優先使用c++編譯的方式
  • c++入門教程-1
    yum -y install gcc-c++如果您的CentOS系統沒有安裝gcc-c++,以上命令就會安裝最新版本的gcc-c++,如果已經安裝了gcc-c++,就會更新到最新版本的gcc-c++,所以,以上命令不管執行多少次都沒有問題。安裝gcc-c++的前提條件是伺服器必須可以訪問網際網路。