sizeof/strlen—字符數組/字符串的長度你真的懂嗎?附代碼

2020-12-17 科技研究員猴哥

高級程式語言的軟體開發過程對於內存的使用雖然不需要程式設計師做過度的檢查,但掌握各種數據類型的長度對任何程式設計師的編程開發都是至關重要的。

數據類型的長度

本文將對各種數據類型的變量長度做詳細介紹,以供大家參考、學習。

求基本數據變量類型的長度—sizeof

基本數據類型的長度:

布爾:bool字符:char整數:short、int、long、long long浮點數:float、double一個問題:除bool以外的上述各變量指針所佔字節數是多少呢?代碼與結果:

基本數據變量字節長度代碼
結果

重點:字符數組與字符串所佔的字節長度

這是一個很容易混淆的點,字符串與字符數組,sizeof與strlen,直接看代碼:

字符數組、字符串的長度

說明:

sizeof運算符指出的是整個數組的長度:15位元組strlen返回的是存儲在數組中的字符串的長度,而非數組本身長度strlen只計算可見字符,而不會包含結束字符『\0』存儲字符串到字符數組中要求數組長度至少為字符串長度strlen+1字符串以『\0』為結束標誌按照上述規則,代碼結果就很容易理解了:

運行結果

有趣現象的解釋:

字符列印時被'\0'結束

總結

防止越界訪問最關鍵的就是熟知變量、數組的大小,熟練的掌握所有變量類型所佔的字節數對於任何程式設計師來說都是有百利而無一害的。

相關焦點

  • 實例分析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("字符串的長度為
  • 經典C語言面試題:sizeof與strlen的區別
    sizeof不能返回動態地被分配的數組的大小。2、strlen是C語言中的庫函數,所在頭文件為#include <string.h>其函數原型為unsigned int strlen(char *s); 其中s為指定的字符串。   注意:strlen只能用char *作為參數,它求的是字符串的實際長度,方法是從開始到遇到第一個'\0'結束。
  • c語言指針與字符數組
    我們所說的字符串就是字符數組的一種,就如我們常見的"hello world!",字符串的使用在C語言中也是非常重要的,常常會遇到一些操作,如字符串的修改、拷貝、字符串長度等,在物聯網的應用中也尤為突出,物聯網應用中所用的模組,大多是需要使用AT指令的,這就需要對字符串的操作。
  • C++如何理解字符串長度函數strlen
    1、字符串長度函數的原型為size_t strlen(const char *str); 其中size_t實際上是unsigned int,其是用typedef 定義的unsigned int一個別名size_t,代碼如下typedef unsigned int size_t
  • 一文帶你了解c++和c中字符串的使用
    說完了c,那麼對於我們的c++來說,它定義字符串就簡單多了,因為有關鍵字來定義,你一看就知道。那麼下面大家就隨著我的筆步一起來看看究竟吧!(2)strlen是一個C語言庫函數,這個庫函數的原型是:size_t strlen(const char *s);這個函數接收一個字符串的指針,返回這個字符串的長度(以字節為單位)。注意一點是:strlen返回的字符串長度是不包含字符串結尾的'\0'的。我們為什麼需要strlen庫函數?
  • 一起學習C/C++ (7) 分辨sizeof和strlen
    正因為sizeof不是函數,因此我們不把它所要求得長度的對象叫做參數,這也是sizeof不能求得void類型的長度 你無法求出sizeof(void),其實你是無法聲明出void的一個變量的,void指的是一個空類型,空類型你是無法知道變量內存空間大小的,所以你用sizeof去求肯定是不行的。
  • 小白學習C語言字符串要掌握的基本要點
    C語言沒有為字符串單獨指定一種類型,想要使用一個字符串,你必須定義一個char數組來存儲這一串連續、相鄰的字符,因此稱之為字符串。一、簡單的字符串定義和使用定義的時候可以指定長度,也可以不指定長度,指定長度的話後面的字符串長度不能超過指定的長度。顯示字符串的時候利用%s格式控制符顯示就可以了。
  • 快速上手系列-C語言之字符串處理函數(一)
    C語言中常用的字符串操作函數,有比如計算字符串長度、字符串拷貝,字符串比較等這樣的整體操作函數,有字符串查詢函數,也有字符串轉換函數等等,這裡先介紹字符串整體操作函數。字符串整體操作函數實際編程中,經常遇到對字符串整體的控制等操作,比如長度測量函數strlen(),字符串拷貝函數strcpy()/strncpy(),字符串比較函數 strcmp()/strncmp(),字符串連接函數strcat()/strncat()等,這些函數是非常有用的。
  • 乾貨:你知道數組和指針有什麼區別嗎?
    你真的理解聲明和定義嗎?3. 數組和指針的底層是如何訪問數據的?4. 哪些場景可以用指針代替數組?5. 為什麼C語言要把數組形參退化為指針?6. 如何使用指針訪問多維數組?7. 即確實存在一種指針和數組的定義完全相同的上下文環境。不幸的是,這只是數組的一種極為普通的用法,並非所有情況下都是如此。2. 你真的理解聲明和定義嗎?想要要真正理解為什麼 extern int *x 不等於 extern int x[],我們首先需要搞清楚什麼是聲明,什麼是定義。
  • 【C++】搞懂char與wchar_t字符串
    來分析一下代碼,其中str1、str3、str4是一個東西(str3區別只是內存在堆上),str2是字面值常量,str5是單純的字符數組。1.1. 常規字符串對於str1、str3、str4這種正常的字符串,就可以隨意拿字符串函數和下標訪問,進行各種操作。
  • C語言|字符串的複製、連接和比較及字符串長度
    字符串複製函數strcpy()strcpy(s1,s2);該函數把字符串s2複製到s1,直到遇到s2中的』\0』為止。s1要有足夠的空間容納s2,且s1中的內容被覆蓋,函數返回的是s1如果函數執行前s1有初值,那麼值被覆蓋由於函數返回值是s1,也可以直接輸出此函數2.
  • PHP部分字符串函數匯總
    替換字符串的PHP字符串函數str_replace(search,replace,$str): 從$str中查找search用replace來替換str_irreplace(search,replace,$str):strtr($str,search,replace): 這個函數中replace不能為"";substr_replace($Str,$rep,$start[,
  • C語言 -- 字符串詳解
    ,但是C語言不存在顯式的字符串類型,C語言中的字符串都以字符串常量的形式出現或存儲在字符數組中。= '\0'){    printf("%c ",*message++);  }  printf("\n");  return 0;}這段代碼,使用字符指針遍歷了字符串常量中的每一個字符。 1.3、字符數組用於存放字符的數組稱為字符數組。
  • C/C++基礎之sizeof使用
    如果字符數組表示字符串,數組末自動插入 '\0',所以 c 的數據類型是 char[7] ,所以 sizeof(c)=sizeof(char[7])==7。>   return 0;}輸出不是 7 ,這裡函數參數 str[] 已不再是數組類型,而是蛻變成指針,我們調用函數 GetStrLength() 時,程序會在棧上分配一個大小為 7 的數組嗎?
  • C語言字符串詳解
    */這段代碼,使用字符指針遍歷了字符串常量中的每一個字符。 1.3、字符數組用於存放字符的數組稱為字符數組。在 C 語言中,除了字符串常量外,其他所有字符串都必須存儲於字符數組或動態分配的內存中。定義一個字符數組和定義一個普通數組一樣,不同的是字符數組中存放的是字符數據而已:char charArray[] = {'H','e','l','l','o'};    // 聲明並初始化一個字符數組 這句話定義並初始化了一個字符數組 charArray。這個數組的長度實際上為 6 ,因為會自動添加一個字符串結束符 '\0'。
  • C語言字符數組和字符串
    字符串主要用於編程,概念說明、函數解釋、用法詳述見正文,這裡補充一點:字符串在存儲上類似字符數組,所以它每一位的單個元素都是可以提取的。如s=「abcdefghij」,則s[1]=「b」,s[9]="j",而字符串的零位正是它的長度,如s[0]=10(※上述功能Ansistring沒有。),這可以給我們提供很多方便,如高精度運算時每一位都可以轉化為數字存入數組。
  • 華為機試題一:計算字符串最後一個單詞的長度,單詞以空格隔開.
    輸入描述:輸入一行,代表要計算的字符串,非空,長度小於5000。輸出描述:輸出一個整數,表示輸入字符串最後一個單詞的長度。=EOF)        a=strlen(str);        printf("%d",a);    return 0;}代碼解析:C(clang11):Clang是一個C語言、C++、Objective-C語言的輕量級編譯器。在此表示用C語言格式進行編譯。
  • 數組越界及其避免方法,C語言數組越界詳解
    當調用 Test() 函數時,系統將會給它分配一片連續的內存空間,而變量 char buffer[7] 與 int flag 將會緊挨著進行存儲,用戶輸入的字符串將會被複製進 buffer[7] 中。如果這個時候,我們輸入的字符串數量超過 6 個(注意,有字符串截斷符也算一個),那麼超出的部分將破壞掉與它緊鄰著的 flag 變量的內容。
  • 你知道char *s和char s[]的區別嗎?
    而聲明,只給了個房產證卻不給你分房子。str1 是 char *類型 。它是一個指針,這個指針指向一個字符串。str2 是 char [] 類型。它是一個數組,他代表了這堆內存空間。「hello」字符串在內存中是這樣存放的
  • 字符串處理函數
    2.gets 函數---輸入字符串的函數#include<stdio.h>void main(){    char str[10];//定義字符數組    gets(str);//輸入字符串    puts(str);//輸出字符串}輸入:ABCD 1234