strlen和sizeof的区别……

本文详细对比了sizeof操作符与strlen函数的功能与使用场景。sizeof用于获取类型或变量的内存大小,其结果类型为size_t;而strlen用于计算以null终止的字符串长度。此外,文章还介绍了两者在数组和指针上的不同表现。
1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。
该类型保证能容纳实现所建立的最大对象的字节大小。 


2.sizeof是算符,strlen是函数。 


3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。
sizeof还可以用函数做参数,比如: 
short f();
printf("%d\n", sizeof(f()));
输出的结果是sizeof(short),即2。 


4.数组做sizeof的参数不退化,传递给strlen就退化为指针了。 


5.大部分编译程序 在编译的时候就把sizeof计算过了 是类型或是变量的长度这就是sizeof(x)可以用来定义数组维数的原因 
char str[20]="0123456789";
int a=strlen(str); //a=10;
int b=sizeof(str); //而b=20;


6.strlen的结果要在运行的时候才能计算出来,时用来计算字符串的长度,不是类型占内存的大小。 


7.sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。


8.当适用了于一个结构类型时或变量, sizeof 返回实际的大小,
当适用一静态地空间数组, sizeof 归还全部数组的尺寸。
sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸 


9.数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址,
如: 
fun(char [8])
fun(char [])
都等价于 fun(char *) 
在C++里参数传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小
如果想在函数内知道数组的大小, 需要这样做:
进入函数后用memcpy拷贝出来,长度由另一个形参传进去 
fun(unsiged char *p1, int len)
{
  unsigned char* buf = new unsigned char[len+1]
  memcpy(buf, p1, len);
}


我们能常在用到 sizeof 和 strlen 的时候,通常是计算字符串数组的长度
看了上面的详细解释,发现两者的使用还是有区别的,从这个例子可以看得很清楚:


char str[20]="0123456789";
int a=strlen(str); //a=10; >>>> strlen 计算字符串的长度,以结束符 0x00 为字符串结束。
int b=sizeof(str); //而b=20; >>>> sizeof 计算的则是分配的数组 str[20] 所占的内存空间的大小,不受里面存储的内容改变。  


上面是对静态数组处理的结果,如果是对指针,结果就不一样了


char* ss = "0123456789";
sizeof(ss) 结果 4 ===》ss是指向字符串常量的字符指针,sizeof 获得的是一个指针的之所占的空间,应该是


长整型的,所以是4
sizeof(*ss) 结果 1 ===》*ss是第一个字符 其实就是获得了字符串的第一位'0' 所占的内存空间,是char类


型的,占了 1 位


strlen(ss)= 10 >>>> 如果要获得这个字符串的长度,则一定要使用 strlen


http://zhidao.baidu.com/link?url=KIdIQmYsZqtbamM748zxkyswtwOxd21sRmlfnkU0AhnTpptQW-Hh9C2QXGtggQrys9F5Mzl8VFRJJNaiX8LT2_


你提到的: > **7.13. `sizeof(arr[])` 返回数组总长度;`strlen()` 返回……** 这个说法 **部分正确,但表述不严谨,容易引起误解**。下面我们来 **详细解释、纠正误区,并给出准确用法代码示例**。 --- ## ✅ 正确理解:`sizeof` 与 `strlen` | 函数/操作 | 作用 | 所属头文件 | 适用类型 | 是否包含 `\0` | |----------|------|-------------|-----------|----------------| | `sizeof(arr)` | 编译时运算符,返回**字节大小** | 无(语言内置) | 任意类型 | 是(算进去) | | `strlen(str)` | 函数,返回字符串**字符数(不含 `\0`)** | `<string.h>` | 字符数组 / 字符串指针 | 否 | --- ## 🔍 一、`sizeof(arr)` 的正确用法 ### ❌ 错误写法:`sizeof(arr[])` ```c // 这是语法错误! sizeof(arr[]) ``` 👉 `arr[]` 是声明形式,不能作为表达式使用。 ### ✅ 正确写法:`sizeof(arr)` ```c int arr[10]; printf("%zu\n", sizeof(arr)); // 输出:40(假设 int 为 4 字节) ``` ### ✅ 计算数组元素个数: ```c int arr[10]; int n = sizeof(arr) / sizeof(arr[0]); // n = 40 / 4 = 10 ``` 📌 这是 C 语言中**获取静态数组长度的标准方法**。 --- ### ⚠️ 陷阱:函数传参后失效! ```c #include <stdio.h> void f(int arr[]) { printf("在函数内: %zu\n", sizeof(arr)); // 输出 8(指针大小),不是数组大小! } int main() { int arr[10] = {0}; printf("在 main 中: %zu\n", sizeof(arr)); // 正确:40 f(arr); return 0; } ``` > 💡 原因:`arr` 作为参数传递时退化为指针(`int*`),`sizeof(arr)` 实际上是 `sizeof(int*)` ✅ 解决方案:必须额外传长度 ```c void process(int arr[], int n) { for (int i = 0; i < n; i++) { // 处理 arr[i] } } ``` --- ## 🔍 二、`strlen()` —— 字符串长度函数 ```c #include <string.h> size_t strlen(const char *s); ``` - 功能:从 `s` 开始向后扫描,直到遇到 `\0`,返回中间字符的个数。 - 不包含 `\0` - 要求字符串必须以 `\0` 结尾 ### ✅ 示例: ```c char str[] = "hello"; // 实际存储:'h','e','l','l','o','\0' → 共6字节 printf("sizeof(str) = %zu\n", sizeof(str)); // 6(包括 \0) printf("strlen(str) = %zu\n", strlen(str)); // 5(只算有效字符) ``` ### 🧪 对比演示: ```c #include <stdio.h> #include <string.h> int main() { char s1[] = "abc"; char *s2 = "hello"; printf("s1[]: sizeof=%zu, strlen=%zu\n", sizeof(s1), strlen(s1)); // 4, 3 printf("s2*: sizeof=%zu, strlen=%zu\n", sizeof(s2), strlen(s2)); // 8(指针), 5 return 0; } ``` 输出(64位系统): ``` s1[]: sizeof=4, strlen=3 s2*: sizeof=8, strlen=5 ``` --- ## ✅ 总结对比表 | 表达式 | 类型 | 返回值含义 | 示例说明 | |--------|------|------------|----------| | `sizeof(arr)` | 操作符 | 数组总字节数 | `int a[10];` → `sizeof(a)=40` | | `sizeof(arr)/sizeof(arr[0])` | 技巧 | 元素个数 | `n = 10` | | `strlen(str)` | 函数 | 字符个数(不含 `\0`) | `"hello"` → `5` | | `strlen` 对非字符串指针调用 | 危险 | 未定义行为 | 若无 `\0` 会越界 | --- ## 🛑 常见错误与建议 ### ❌ 错误 1:误以为 `sizeof` 能在函数内获取动态数组长度 ```c void func(int arr[]) { int n = sizeof(arr) / sizeof(arr[0]); // ❌ 错!这是指针大小 } ``` ### ❌ 错误 2:对指针使用 `sizeof` 期望得到字符串长度 ```c char *p = "abcdef"; int len = sizeof(p); // 得到的是 8(64位下指针大小),不是 6! ``` ### ✅ 建议: - 静态数组长度:用 `sizeof(arr)/sizeof(arr[0])` - 字符串内容长度:用 `strlen(str)` - 传递数组给函数时:**一定要传长度** - 不要混淆“字节大小”“字符长度” --- ## ✅ 实用宏定义(推荐) ```c #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) ``` 使用: ```c int arr[] = {1, 2, 3, 4, 5}; for (int i = 0; i < ARRAY_SIZE(arr); i++) { printf("%d ", arr[i]); } ``` > ⚠️ 注意:该宏只能用于**本地定义的数组**,不能用于函数参数或 `malloc` 分配的内存。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值