#include <iostream> #include <cstring> using namespace std; int main() { const char a[] = "你好", *s = a; cout << sizeof(a) << ' ' << sizeof(s) << ' ' << sizeof(*s) << ' ' << strlen(s) << endl; }
时间: 2025-09-09 08:48:59 AIGC 浏览: 9
### C++ 中 `sizeof` 和 `strlen` 的行为差异
在 C++ 编程中,`sizeof` 是一个编译期运算符,用于计算变量或类型的字节大小。而 `strlen` 则是一个运行时函数,来自标准库 `<cstring>`,专门用来测量以 null 结尾的字符串的实际长度。
#### 使用 `sizeof`
当应用于指针或数组时,`sizeof` 返回的是对象本身的内存占用情况。对于指针来说,它返回存储该指针所需的字节数;而对于数组,则会返回整个数组分配的空间大小(即元素数量乘以单个元素的大小)。需要注意的是,在某些情况下,如果数组作为参数传递给函数,那么传入后的形式实际上变成了指向首地址的一个简单指针,此时再调用 `sizeof` 就只会得到这个指针所占空间的信息而不是原始数组的真实尺寸[^1]。
下面展示如何利用 `sizeof` 来获取不同类型数据结构的大小:
```cpp
#include <iostream>
int main() {
const char* ptrStr = "Example";
char arrStr[] = "Example";
std::cout << "Size of pointer to string: " << sizeof(ptrStr) << " bytes\n"; // Size of a pointer on your system.
std::cout << "Size of character array: " << sizeof(arrStr) << " bytes\n"; // Includes space for '\0'.
}
```
#### 应用 `strlen`
另一方面,`strlen` 函数仅适用于那些由连续字符构成并以 NULL('\0')结束表示终止标志的标准C风格字符串。它的作用在于统计从起始位置到第一个遇到NULL之前的有效字符数目,因此不会计入结尾处那个特殊的零值本身[^2]。
这里有一个例子来对比两者的结果:
```cpp
#include <iostream>
#include <cstring>
using namespace std;
void demonstrateSizes(const char str[]) {
cout << "Length via strlen(): " << strlen(str) << endl;
cout << "Sizeof operator result: " << sizeof(str) << " bytes" << endl;
}
int main(){
const char myStringLiteral[]="Test String.";
demonstrateSizes(myStringLiteral);
return 0;
}
// Output might be something like this depending upon architecture:
/* Length via strlen(): 12
Sizeof operator result: 8 bytes */
```
在这个案例里可以看到,尽管实际输入串有十三个可见字符加最后一位隐形的null总计十四位长,但由于通过函数形参接收过来之后就退化成了单纯的指针类型所以后者只显示出八比特宽幅代表当前平台下常规指针对应的数据宽度而已[^3].
综上所述,虽然二者都能提供关于特定实体的一些度量信息,但它们的工作机制完全不同——前者侧重于物理层面的整体布局考量,而后者的关注焦点则集中在逻辑意义上的内容表达之上。
阅读全文
相关推荐


















