程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> sizeof && strlen 的區別,sizeof函數

sizeof && strlen 的區別,sizeof函數

編輯:C++入門知識

sizeof && strlen 的區別,sizeof函數


本文主要記錄了 sizeof 操作符 和 strlen() 函數的區別,以及各自的用途。(在下才疏學淺,發現錯誤,還請留言指正)


sizeof 和 strlen 的區別

示例代碼如下:

#include<stdio.h>
int main()
{
    char str[20]="0123456789";
    printf("strlen(str)==%d\n",strlen(str));//計算字符串的長度(不包括0x00),結果:10
    printf("sizeof(str)==%d\n",sizeof(str));//大小不退化,結果:20

    char* ss = "0123456789";
    printf("strlen(ss)==%d\n",strlen(ss));//結果:10
    printf("sizeof(ss)==%d\n",sizeof(ss));//計算ss指針占用內存空間的大小,結果:4
    return 0;
}

sizeof有哪些作用?


試著用sizeof 替換 strlen計算字符串的長度

像這種替換是很少用到的,之所以這樣寫,僅僅方便知識點的掌握。

//題意:計算字符串的長度,並轉化大寫。
#include <iostream>
#include<string>
using namespace std;
void upperCase(char str[])
{
    int test = sizeof(str);//strlen(str)
    int test2 =sizeof(str[0]);
    for(size_t i=0;i<test/test2;++i)//i<test
    {
        if( 'a' <= str[i] && str[i] <= 'z' )
            str[i] -= ('a' - 'A');
    }
}
int main()
{
    char str[] = "aBcDe";
    //從上面我們知道sizeof(數組),是不退化的,返回的結果是整個數組的大小,而不是裡面元素的個數。
    //如果數組的初始化為 char str[9] = "aBcDe",那麼結果就不正確了。
    cout<<"The length of str is:"<<sizeof(str)/sizeof(str[0])<<endl;//strlen(str)
    upperCase(str);
    cout << str << endl;
    return 0;
}

sizeof計算 union聯合體的大小

示例代碼1:

#include <iostream>
using namespace std;
union u
{
    double a;
    int b;
};
union u2
{
    char a[13];
    int b;
};
union u3
{
    char a[13];
    char b;
};
int main()
{
    cout<<"sizeof(u) == "<<sizeof(u)<<endl;//結果:8
    cout<<"sizeof(u2) == "<<sizeof(u2)<<endl;//結果:16(使用了字節對齊)
    cout<<"sizeof(u3) == "<<sizeof(u3)<<endl;//結果:13(使用了字節對齊)
    return 0;
}

union的大小取決於成員中占用空間最大的那個成員(考慮字節的對齊),同時,考慮字節對齊的符合數據類型有:union,class,struct

CPU對齊的問題,編譯器會盡量把數據放在它的對齊上以提高CPU的命中率。可以使用#pragma pack(x)來修改編譯器的對齊方式。

C++固有類型的對齊取編譯器對齊方式與自身大小中較小的一個。例如:編譯器以2對齊,int類型大小是4,則int的對齊是2和4中最小的2.因為默認的對齊是8(long double),所以固有類型的對齊方式就是自身。如果是符合類型,則都小於8的話,取成員類型最大的對齊。


示例代碼2:

#include <iostream>
using namespace std;
#pragma pack(2)//手動將對齊方式修改為2,所以int的對齊也為2了。所以結果10,如果去掉這一句,則為12
union u
{
    char buf[9];
    int a;
};
int main()
{
    cout<<"sizeof(u) == "<<sizeof(u)<<endl;
    return 0;
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved