请看下边代码:
      ///============================================
char str1[10];
char str2[10];
char str3[10];
str2[0]='\0';
str3[9]='\0';
cout<< "str1的长度: " << strlen(str1) <<endl;
cout<< "str2的长度: " << strlen(str2) <<endl;
cout<< "str3的长度: " <<strlen(str3) <<endl;
       ///=============================================
        
        输出:
             str1的长度: 15
             str2的长度: 0
             str3的长度: 9
        晕,这太让人郁闷了,想不通了,高手请解说一下,不过,现在strlen太让人不    相信了,那应该         用什么才能真正得到一个内存块的长度啊!!!

解决方案 »

  1.   

    sizeof(你要求的东西)/sizeof(TCHAR)
      

  2.   

    第一个是15 正常 因为没有\0 ;在内存中随机碰到一个\0 就计算停止.下一次可能是99或者什么的,随机.
              char str1[10];
     char str2[10];
     char str3[10];  str1 str2 str3在内存中不一定是连续的.
      

  3.   

    同意zxy670(远古象)的方法,这种计算方法同时支持ANSI和UNICODE两种形式在windows环境下一个字符串的结束是以'\0'为标志的,因此,当用cout输出一个字符串时,处理的过程是一直输出直到遇到第一个'\n'标志;你定义的三个char数组都没有进行初始化,而你定义的字符数组对于windows来说,其实就是一个以该字符数组名所代表的一个字符指针,当计算其长度的时候也是从该指针开始,直到遇到'\n'时为计算终止标志的。因此你得到的结果也就不正确了,而是随机的结果。
      

  4.   

    这是我在vc6.0上编译通过,运行得到的结果,不会有问题,to: zxy670(远古象) sizeof()只能得到一种数据类型字节个数,不能得到一内存块的长度啊
      

  5.   

    to fvv(守护者):char str1[10];
    char str2[10];
    char str3[10];  如果它们是在栈里分配的,那么它们是连续的。
      

  6.   

    bool float int等类型会有一个初始值(缺省值),但对于char *则没有,未赋值前得到的是随机的。
      

  7.   

    char str1[10];
    char str2[10];
    char str3[10];
    str2[0]='\0';
    str3[9]='\0';这里没有为str1数组赋初值,可以认为strlen从当前地址(比如&str1[0])开始寻找第一个等于0(也就是'\0')的位置,返回经历的字节数目,现在你应该明白了吧。如果是release版本可能得数也不是15呢
      

  8.   

    对于这类数组就直接sizeof就好
      

  9.   

    可是,我们面对的问题是要求一个 不知道类型(void*),不知道数量,没有初始化 的内存块啊,如:我如果将str1传给一个函数:
             ///........................
                .
                .
              void fun(void* str)
              { 
                    //在这里我们只知道str是一块内存的起始地址
             //这时我们应该如何得到str的长度啊
                    //str指向的可能是  一个char str[10],也可能是 int str[10],
             //也可能是  malloc(10) 等等
              }
               .
               .
            ///.............................
      

  10.   

    fvv(守护者) 说得没有错.
    因为strlen是碰到一个'\0'才会认为字符串结束的.而第一个字符数据组没有赋初值,所以它的内容不定,得到的数据可能是越界的.
    你可以用*(str1+15)来看一下这个值是不是'\0'以验证其正确性.
      

  11.   

    strlen是检查字符串长度 我不清楚是否做边界检查 如果你要看看你的数组有多大可以使用
    sizeof();
    不过它是编译期的,不支持动态 而且作为参数就弱化了
      

  12.   

    你这个函数设计的稍烂了一点:),如果你传一个指针过来,sizeof  只能得到 4(win98se, vc6);strlen是用来计算字符串长度的,不是用来计算内存块大小,建议你认真复习一下各函数的功能。按照你的要求,传一个内存块尺寸做参数会是一个比较好的解决办法,你在调用fun的时候总该知道分配了多少内存。void fun(void* str, int nSize)
              { 
                    //在这里我们只知道str是一块内存的起始地址
             //这时我们应该如何得到str的长度啊
                    //str指向的可能是  一个char str[10],也可能是 int str[10],
             //也可能是  malloc(10) 等等
              }
      

  13.   

    如果是一个数组可以通过sizeof得到长度
    char a[100];
    sizeof(a) 等于 100;
    但是如果你是动态分配的内存,你只能在分配的时候记住其大小
    char *p = new char[100];
    sizeof(p) 等于 4;
      

  14.   

    char  str[] = “Hello” ;
    char   *p = str ;
    int     n = 10;sizeof (str ) =  6   
    sizeof ( p ) =   4   
    sizeof ( n ) =   4   
    void Func ( char str[100])
    {sizeof( str ) =   4 }
    void *p = malloc( 100 );
    sizeof ( p ) =  4
      

  15.   

    同意ukyoking(累) ,如果你需要知道长度,就要把长度做为参数传进来,这是现在流行的做法,可以让你写出不产生泄漏的程序。格式是:
    void fun(void* str, int nSize)
      

  16.   

    strlen是求字符串的长度,一般做法是把字符串长度作为参数,同意snowroad的说法
      

  17.   

    原因如下:
        strlen()得到的是以\n结束的字符串长度(除去\n占用的一个字符),而你str1[10]没有以\n结束,所以不正确,而且很危险