在C++中输出多少是正确的? std::cout<<strlen(pObj)<<std::endl;应该输出多少都不正确,szRet[100];可能任何一个单元可能都不为0,找到的非法的位置,你要对其初始化后,才能有正确的值 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 楼主为什么只声明数组,却没有初始化呢?太不严谨了,建议用memset()初始化一下,然后再去判断一下,像你那样做,很可能造成元素内容的不确定性。 C++的char[]是以\ 0做为节尾来确定长度,而不是以你定义多长来确定长度,lz的写法不叫没有初始化也不叫只有声明,而是定义没有付给它值 struct Data{char a[100];char b[100];}int nSum = sizeof(Data); what is it? ou no! less of a semicolon.struct Data{char a[100];char b[100];};int nSum = sizeof(Data); //what is it? char szRet[100];sizeof(szRet) = 100;但是strlen却不是哦。不要混淆哦、它是的数量是获取'\0'之前的长度。例如你这样操作char szRet[100] = {‘1’}; 则获取的结果是1.所以若果你用了memset,0,则获取的是0为什么不初始化得103?有时有会获取其他数,那楼主的看下堆栈的问题。你试试在char szRet[100];前面添加变量。例如 int a = 0;你看看结果是如何?你再试试把a的值改为 4333,或者其他,是不是又不同值了?入栈 ,出栈 问题、 对于如何表示字符串结束的问题,不同的编程语言有不同的处理办法。有的语言是把字符串的第一个存储单元用来记录字符串的长度,剩下的存储字符串本身的内容。而 C/C++ 采用的方法是,以 '\0' 字符作为字符串终止符。也就是说,不管什么字符串,只要碰到了 '\0‘ ,就认为该字符串已经结束了,而不管 '\0' 后面还有没有其他字符。常用的字符串处理函数如 strcpy 、 strlen 、 strstr 、 strcmp 等等,都是用这种方法来判断字符串结束的。来看下面的代码:char szDest[10],szSrc[100]="aaabbbccc\0ddd\0e";int len=strlen(szData);//得到 len 的值为9,因为 ccc 后面出现了 '\0'strcpy(szDest,szSrc);//OK,执行完成之后 szDest 为 "aaabbbccc",不会导致溢出 再来看看你的代码:void testLen(char *pObj){ std::cout<<strlen(pObj)<<std::endl;}int _tmain(int argc, _TCHAR* argv[]){ char szRet[100]; testLen(szRet); return 0;}这里输出任何值都是有可能的。Windows 系统中,一块内存经过多次申请、释放之后,其中存储的值到底是什么,没有人知道。因为它上一次被释放之前其值有可能被重置了,有可能没有。如果没有的话,那么你申请得到它之后,它就还会残留上一次的数据。所以,得到一块内存之后,最好 memset 重置一下。在这里,你定义了一个可存储100个字符的数组 szRet ,却没有对它进行赋值,那么它的值是不确定的。 既然是这样, strlen 求字符串长度的结果也就无法预测了。 求助:请各位大哥帮我看看这个问题,谢谢! VS2005的附加到进程是干嘛用的?怎么使用? 一个别人的.obj文件,给了我其中的函数名与参数,我能用其中的功能吗? 请问如何修改垂直进度条的颜色? 哪里有H.263的源程序? select * from Name where address like '%abc%'如何在vc中加入%号呢!! USB通信 如何关掉窗口? 询问一个关于VC 6.0环境的简单问题? 试图改变不同类中成员变量或成员函数的值,都有什么方法? VS2010的MFC程序 , 如何在子窗口里显示文字? 读取文字? VS2010默认参数值函数的问题
{
char a[100];
char b[100];
}
int nSum = sizeof(Data); what is it?
struct Data
{
char a[100];
char b[100];
};
int nSum = sizeof(Data); //what is it?
sizeof(szRet) = 100;
但是strlen却不是哦。不要混淆哦、它是的数量是获取'\0'之前的长度。
例如你这样操作char szRet[100] = {‘1’}; 则获取的结果是1.所以若果你用了
memset,0,则获取的是0
为什么不初始化得103?有时有会获取其他数,那楼主的看下堆栈的问题。
你试试在char szRet[100];前面添加变量。例如 int a = 0;
你看看结果是如何?
你再试试把a的值改为 4333,或者其他,是不是又不同值了?
入栈 ,出栈 问题、
常用的字符串处理函数如 strcpy 、 strlen 、 strstr 、 strcmp 等等,都是用这种方法来判断字符串结束的。
来看下面的代码:
char szDest[10],szSrc[100]="aaabbbccc\0ddd\0e";
int len=strlen(szData);//得到 len 的值为9,因为 ccc 后面出现了 '\0'
strcpy(szDest,szSrc);//OK,执行完成之后 szDest 为 "aaabbbccc",不会导致溢出
再来看看你的代码:
void testLen(char *pObj)
{
std::cout<<strlen(pObj)<<std::endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
char szRet[100];
testLen(szRet);
return 0;
}
这里输出任何值都是有可能的。
Windows 系统中,一块内存经过多次申请、释放之后,其中存储的值到底是什么,没有人知道。因为它上一次被释放之前其值有可能被重置了,有可能没有。如果没有的话,那么你申请得到它之后,它就还会残留上一次的数据。所以,得到一块内存之后,最好 memset 重置一下。
在这里,你定义了一个可存储100个字符的数组 szRet ,却没有对它进行赋值,那么它的值是不确定的。 既然是这样, strlen 求字符串长度的结果也就无法预测了。