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


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/

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值