C/C++——sizeof和strlen的區別
題目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
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/
相關文章
- sizeof與strlen的區別
- sizeof 與 strlen 的區別
- strlen與sizeof的區別
- C語言中的strlen與sizeof的區別C語言
- c語言陣列、sizeof()及strlen()C語言陣列
- 求陣列長度的兩種方法,以及區別(strlen sizeof)陣列
- sizeof和strlen計算陣列型別和指標型別字串陣列型別指標字串
- C語言中,當計算字元陣列長度時,用sizeof 和strlen 的原理及兩者的區別C語言字元陣列
- 《細說PHP》中strlen和mb_strlen的區別PHP
- 細說PHP中strlen和mb_strlen的區別PHP
- C和C++區別C++
- c++ sizeof使用C++
- 整型字元常量和字元字面量的區別 sizeof(char) 和 sizeof('a')字元
- C++中類的sizeofC++
- 65.C指標---sizeof()函式和strlen()函式常見考指標函式
- C++中strlen函式C++函式
- sizeof 和 strlen 計算陣列大小和長度詳解陣列
- C++中運算子 &和&&、|和|| 的區別C++
- C/C++——基本資料型別的大小並且sizeof(int *) = 8C++資料型別
- C++中結構體的sizeofC++結構體
- C++中的return和exit區別C++
- c++中指標和引用的區別?C++指標
- C++中 struct 和 class 的區別C++Struct
- C++中指標和引用的區別C++指標
- C++和java多型的區別C++Java多型
- C++中struct 和 class的區別C++Struct
- Objective-C 和 C++ 的區別有哪些?ObjectC++
- c與c++的區別C++
- C++學習程式碼--sizeofC++
- c++ 和 c 三目運算子區別C++
- C++ new A 和 new A() 的區別詳解C++
- C/C++引用和指標的聯絡和區別C++指標
- 關於java的引用和c++的區別JavaC++
- C++中break和continue的用法和區別C++
- C++中L和_T()之區別C++
- c++中&和&&有什麼區別C++
- 【C++】C++用new和不用new建立類物件區別C++物件
- C++基礎(八)struct和class的區別C++Struct