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

简单程序如下:
#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;
}
运行结果为:
5
22
22
现在,我就很奇怪了,用new或malloc去申请动态字符数组,明明申请的字符个数和s一样多,为什么strlen(p)或者strlen(p1)的时候输出22呢,而不是5!!??

慕姐8265434
浏览 261回答 2
2回答

慕容森

输出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;时又是什么?

吃鸡游戏

因为strlen是计算以0为结束的字符串的个数,而你申请的空间内容是随机的,并没有用0填充。所以结果是不对的,strlen会计算在内存空间到遇到0为止的个数。
打开App,查看更多内容
随时随地看视频慕课网APP