字符串指针、字符数组的sizeof和strlen结果

int main(){
	
	char *p1="china";
	char p2[]="china";
	char p3[100]={0};
	strcpy(p3, "china");
	cout << sizeof(p1) << endl;
	cout << sizeof(p2) << endl;
	cout << sizeof(p3) << endl;
	cout << strlen(p1) << endl;
	cout << strlen(p2) << endl;
	cout << strlen(p3) << endl;
}

 在vc上面的输出结果:

 

4

6

100

5

5

5

 

解释:sizeof(p1)是一个指针的大小;sizeof(p2)和sizeof(p3)是数组的大小,包括'\0',strlen则不包括结尾的'\0'。

### `sizeof` `strlen` 在字符数组上的区别 `sizeof` `strlen` 是 C 语言中用于处理数组字符串的两个常用工具,但它们的功能使用场景存在显著差异。特别是在处理字符数组时,理解它们的区别对于避免越界访问、数组退化以及内存管理错误至关重要。 #### `sizeof` 的作用与特性 `sizeof` 是一个编译时运算符,用于计算变量或数据类型在内存中所占的字节数。当应用于数组时,`sizeof` 返回的是整个数组占用的内存大小,包括数组中未使用的空间终止符 `\0`(如果数组字符串)。 例如,对于字符数组: ```c char arr[] = "hello"; printf("%zu\n", sizeof(arr)); // 输出 6,包括 'h','e','l','l','o','\0' ``` 上述代码中,`sizeof(arr)` 返回的是数组 `arr` 所占的总字节数,即 6 个字节(每个字符占 1 字节)[^1]。 #### `strlen` 的作用与特性 `strlen` 是标准库函数,定义在 `<string.h>` 中,用于计算字符串的有效字符数,不包括结尾的空字符 `\0`。它通过从起始位置逐个字符检查,直到遇到 `\0` 为止。 例如: ```c char arr[] = "hello"; printf("%zu\n", strlen(arr)); // 输出 5 ``` 上述代码中,`strlen(arr)` 返回的是字符 `'h'` 到 `'o'` 的数量,即 5 个字符,`\0` 不计入长度[^2]。 #### `sizeof` 与 `strlen` 的关键区别 | 特性 | `sizeof` | `strlen` | |------|----------|----------| | 类型 | 运算符 | 函数 | | 返回值单位 | 字节 | 字符数 | | 是否计算 `\0` | 是 | 否 | | 是否需要以 `\0` 结尾 | 否 | 是 | | 是否适用于非字符串数组 | 是 | 否 | 例如,对于一个未以 `\0` 结尾的字符数组: ```c char arr[6] = {'h', 'e', 'l', 'l', 'o', '\0'}; printf("%zu\n", sizeof(arr)); // 输出 6 printf("%zu\n", strlen(arr)); // 输出 5 ``` 上述代码中,`sizeof(arr)` 返回的是数组的总大小(6 字节),而 `strlen(arr)` 返回的是字符串的有效长度(5 个字符)。 #### 常见错误与注意事项 - **数组退化问题**:当数组作为参数传递给函数时,会退化为指针,此时 `sizeof` 将返回指针的大小(通常是 4 或 8 字节),而不是数组的实际大小。 ```c void func(char arr[]) { printf("%zu\n", sizeof(arr)); // 输出 8(64 位系统) } ``` - **未初始化的字符串**:如果字符数组未正确初始化为字符串(即没有 `\0`),`strlen` 可能会访问未定义的内存区域,导致未定义行为。 - **越界访问**:使用 `strlen` 时,应确保字符串以 `\0` 结尾,否则可能导致越界访问或无限循环。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值