简单程序如下:#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;时又是什么?
吃鸡游戏
TA贡献1829条经验 获得超7个赞
因为strlen是计算以0为结束的字符串的个数,而你申请的空间内容是随机的,并没有用0填充。
所以结果是不对的,strlen会计算在内存空间到遇到0为止的个数。
添加回答
举报
0/150
提交
取消