std::cout<<strlen(pObj)<<std::endl;
应该输出多少都不正确,szRet[100];可能任何一个单元可能都不为0,找到的非法的位置,你要对其初始化后,才能有正确的值

解决方案 »

  1.   

    楼主为什么只声明数组,却没有初始化呢?太不严谨了,建议用memset()初始化一下,然后再去判断一下,像你那样做,很可能造成元素内容的不确定性。
      

  2.   

    C++的char[]是以\ 0做为节尾来确定长度,而不是以你定义多长来确定长度,lz的写法不叫没有初始化也不叫只有声明,而是定义没有付给它值
      

  3.   

    struct Data
    {
    char  a[100];
    char b[100];
    }
    int nSum = sizeof(Data);  what is it? 
      

  4.   

    ou no!  less of a semicolon.
    struct Data
    {
    char  a[100];
    char b[100];
    };
    int nSum = sizeof(Data);  //what is it? 
      

  5.   

    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,或者其他,是不是又不同值了?
    入栈 ,出栈 问题、
      

  6.   

    对于如何表示字符串结束的问题,不同的编程语言有不同的处理办法。有的语言是把字符串的第一个存储单元用来记录字符串的长度,剩下的存储字符串本身的内容。而 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 求字符串长度的结果也就无法预测了。