您的位置:首页 > 编程语言 > C语言/C++

C/C++——sizeof和strlen的区别

2016-01-14 20:04 477 查看

题目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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: