C++基础--sizeof和strlen的区别

首先,来运行一段程序:

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

int main()
{
    char *a  = "aaaa";
    int x = sizeof(a);
    int y = strlen(a);

    printf("%d\n", x);
    printf("%d\n", y);
    
    return 0;
}

 运行结果为:

再看下面这段程序:

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

int main()
{
    char *a  = "aaa";
    int x = sizeof(a);
    int y = strlen(a);
    int s = sizeof(char *);
    int s1 = sizeof(char);
    //int s2 = strlen(char*);
printf(
"%d\n", s); printf("%d\n", s1); printf("%d\n", x); printf("%d\n", x); return 0; }

运行结果为:

以上结果表示char*占用的内存大小为4, char占用的内存大小为1;

 

运行以上两个程序,可以总结出sizeof和strlen的区别为:

1. sizeof的参数可以是数据类型,也可以是变量,而strlen只能以以'\0'结尾的字符串作为参数;

2. sizeof计算的是数据类型占内存的大小,strlen计算的是字符串实际的长度

3. sizeof是操作符,strlen是string的库函数;编译器是编译时就计算出了sizeof的结果,而strlen只有在运行时才计算;

4. sizeof的参数为原参数,strlen的参数会变化为指针

 

### C++ 中 `sizeof` `strlen` 的区别 #### 定义与用途 - **`sizeof`** 是一个操作符,用于计算数据类型的内存大小(以字节为单位),其结果在编译时确定。它可以作用于任意类型的数据对象或表达式[^4]。 - **`strlen`** 是标准库中的函数 (`<cstring>` 头文件),专门用于计算以 `\0` 结束的 C 风格字符串的实际长度,不包括终止符 `\0` 自身[^4]。 #### 计算方式 - 对于 `sizeof`,它基于数据类型本身的定义来决定内存占用情况。例如,在大多数平台上,`sizeof(char)` 始终等于 1 字节,而 `sizeof(int)` 则可能因平台不同而变化。 - 关于 `strlen`,它的实现依赖遍历整个字符串直到遇到第一个零字符为止,因此属于运行期行为[^5]。 #### 应用场景对比 当处理固定尺寸数组时: ```cpp char arr[] = "example"; std::cout << sizeof(arr); // 输出9 (含 '\0') std::cout << strlen(arr); // 输出7 不计 '\0' ``` 如果针对指针变量应用这两个工具则会有显著差异: ```cpp const char* ptr = "pointer example"; std::cout << sizeof(ptr); // 输出通常为4或8取决于系统架构(32bit/64bit) std::cout << strlen(ptr); // 正确反映字符串有效部分长度即"pointer example" ``` 这里需要注意的是,由于 `ptr` 实际上只是一个地址值而非真正的存储区域描述者,所以通过 `sizeof()` 获取到的信息仅限于此指针本身所需空间而不是其所指向的内容范围[^2]。 另外值得注意的一点是在跨平台开发过程中可能会碰到一些细微差别比如下面这段程序片段展示出来的现象: ```cpp #include <iostream> using namespace std; int main(){ string s="test"; cout<< "Sizeof String Object:"<<sizeof(s)<<endl; } // On Windows may print Sizeof String Object:32 // But on Linux could be different like Sizeof String Object:24 depending upon STL implementation details. ``` 这表明即使对于相同源码而言,最终得到关于某些复杂结构体实例化后的具体数值也可能有所波动这是因为内部成员布局以及额外管理字段的存在所致[^1]。 综上所述可以看出两者虽然表面上看似都能提供某种意义上的“规模”度量但实际上它们各自关注的重点完全不同而且适用场合也互有侧重应该根据实际情况合理选用相应的方法来进行测量评估工作。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值