为了账号安全,请及时绑定邮箱和手机立即绑定

strlen()函数取字符串长度问题?求高手指点

strlen()函数取字符串长度问题?求高手指点

慕姐8265434 2021-02-09 15:07:44
简单程序如下:#include <iostream>#include <string>#include <cstring>#include "stdio.h"#include "stdlib.h"using namespace std;int main(){char* s="hello";cout<<strlen(s)<<endl;char* p=new char[strlen(s)];cout<<strlen(p)<<endl;char* p1=(char*)malloc(strlen(s));printf("%d\n",strlen(p1));return 0;}运行结果为:52222现在,我就很奇怪了,用new或malloc去申请动态字符数组,明明申请的字符个数和s一样多,为什么strlen(p)或者strlen(p1)的时候输出22呢,而不是5!!??
查看完整描述

2 回答

?
慕容森

TA贡献1853条经验 获得超18个赞

输出22也是一个偶然。通过malloc和new只是申请了一块大小为5的内存,p1和p只是指向这块内存的地址,此时,这块内存里的数据是未知的。
strlen函数是计算字符串的长度,换句话说是计算出字符串首指针到\0的字符个数,由于p1和p指向这块内存的内容是随机的,也就是说\0的位置也是不固定的。在你的程序中,从p1开始第23个字符是\0,所以计算出的大小就是22了。
你可以试一下,
再printf("%d\n",strlen(p1));之前加上*(p1+3) = 0;你再看看此时的打印结果是什么?
换上*(p1+1) = 0;时又是什么?

查看完整回答
反对 回复 2021-03-28
?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

因为strlen是计算以0为结束的字符串的个数,而你申请的空间内容是随机的,并没有用0填充。
所以结果是不对的,strlen会计算在内存空间到遇到0为止的个数。

查看完整回答
反对 回复 2021-03-28
  • 2 回答
  • 0 关注
  • 296 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信