C/C++——sizeof和strlen的區別

readyao發表於2016-01-14

題目1(騰訊11年筆試題):

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

void func(char str_arg[100])
{
    printf("\nstr_arg = %s\n", str_arg);
    printf("sizeof(str_arg) = %d\n", sizeof(str_arg));
    printf("strlen(str_arg) = %d\n", strlen(str_arg));
}


int main()
{
    char str[] = "Hello";//注意和char * str = "Hello";是不一樣的結果
    printf("str = %s\n", str);
    printf("sizeof(str) = %d\n", sizeof(str));
    printf("strlen(str) = %d\n", strlen(str));

    char * p = str;

    printf("\np = %s\n", p);
    printf("sizeof(p) = %d\n", sizeof(p));//linux 64位系統下,指標的長度是8位元組,但是windows 64位系統下,指標的長度是4位元組
    printf("strlen(p) = %d\n", strlen(p));

    func(str);

    return 0;
}


輸出為:

str = Hello
sizeof(str) = 6
strlen(str) = 5

p = Hello
sizeof(p) = 8
strlen(p) = 5

str_arg = Hello
sizeof(str_arg) = 8
strlen(str_arg) = 5


題目2(騰訊11年筆試題):

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

void func(char str_arg[2])
{
    printf("\nstr_arg = %s\n", str_arg);
    printf("sizeof(str_arg) = %d\n", sizeof(str_arg));
    printf("strlen(str_arg) = %d\n", strlen(str_arg));
}


int main()
{
    char str[] = "Hello";

    func(str);

    return 0;
}
輸出:

str_arg = Hello
sizeof(str_arg) = 8
strlen(str_arg) = 5


例子3:靜態陣列

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


int main()
{
    char * str = "Hello"; 
    printf("str = %s\n", str);
    printf("sizeof(str) = %d\n", sizeof(str));
    printf("strlen(str) = %d\n", strlen(str));

    char * p = str;

    printf("\np = %s\n", p);
    printf("sizeof(p) = %d\n", sizeof(p));//linux 64位系統下,指標的長度是8位元組,但是windows 64位系統下,指標的長度是4位元組
    printf("strlen(p) = %d\n", strlen(p));


    return 0;
}
輸出:

str = Hello
sizeof(str) = 8
strlen(str) = 5

p = Hello
sizeof(p) = 8
strlen(p) = 5

例子4:動態陣列

#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    char * str = new char[10];
    
    cout << "str = " << str << endl;
    cout << "sizeof(str) = " << sizeof(str) << endl;
    cout << "strlen(str) = " << strlen(str) << endl;

    cout << endl;
    str = "Hello";
    cout << "str = " << str << endl;
    cout << "sizeof(str) = " << sizeof(str) << endl;
    cout << "strlen(str) = " << strlen(str) << endl;

    return 0;
}
輸出:

str = 
sizeof(str) = 8
strlen(str) = 0

str = Hello
sizeof(str) = 8
strlen(str) = 5


總結:

1. Linux和Windows不同位數的系統指標的長度不同

在題目1中可以看到指標的長度是8個位元組,本程式是在ubuntu64位系統下面輸出的結果。

如果是linux32位系統指標的長度是4個位元組,在windows32位和64位系統下指標的長度都是4個位元組。

sizeof(p) = 8
sizeof(str_arg) = 8


2.對字串進行sizeof操作的時候,會把字串的結束字元'\0'計算進去,進行strlen操作求字串的長度不把結束字元'\0'計算進去。sizeof返回定義arr陣列時,編譯器為其分配的陣列空間大小,不關心裡面存了多少資料。strlen只關心儲存的資料內容,不關心空間的大小和型別。

在例子3和例子4中, str是一個指標不是一個陣列,所以sizeof(str) = 8;但是strlen(str) = 5;

str = Hello
sizeof(str) = 6
strlen(str) = 5


3.題目2中的形參中的str_arg是一個指標,strlen是對該指標指向的字串進行求長度操作,與那個2沒有關係,寫成100也是直接對指向的字串進行求長度。

4.陣列作為函式引數傳遞的時候已經退化為指標了,func函式的引數str_arg只是表示一個指標,sizeof對指標求長度就是該指標變數本身的長度大小。(本系統指標長度為8個位元組)

題目1中的p也是一個指標變數,所以sizeof(p) = 8;


具體還可參考:

http://blog.csdn.net/21aspnet/article/details/1539951

http://zhidao.baidu.com/link?url=G9BNVvK7_pojawc3RdWvWv_pPZWmb5E1au9XfMVSuKMNk8hGqsfjKQakJc_q1pmQBOHkB0-Tvx-p5mnMSs1kTq

http://blog.163.com/pengfeicui@yeah/blog/static/106403250201010793412165/

相關文章