因为str22 是个指针常量,没有内存空间

解决方案 »

  1.   


    如果 int fun(char * p_str){............}  在这个函数体中,指针 p_str 是不是也没有分配内存空间,在函数体中使用时,会不会出现内存不能read的情况呢?
      

  2.   

    LZ的代码不止这一个问题,一条一条说吧。
    char * str22 = new char[30];  //分配30个字符的空间,可以写入29个字符,外加一个结束符0,所以不出错。
    char * str22 =  “”;//分配一个字符空间,就是结束符0,之后就是别的变量内存或程序,多写几个字符进去就出错了。
    GetWindowText(adminer, str22, sizeof(str22)); //sizeof(str22)是指针的长度,而不是指针所指内容的长度,32位时固定是4。str22 =  “”时就出错了,str22 = new char[30];就不出错,但最多只能写进去4个字。
    正确的方法是 char str22[30]; GetWindowText(adminer, str22, sizeof(str22)-1); 减1的目的是留一个结束符。
      

  3.   

    调用时分配空间,
    char str22[30];
    fun( str22 );
    调用前先分配了30个字节内存。
    也可以 fun(0); 调用,在函数体内判断,如果是0就不操作。
    有一个问题,函数体不知道指针内容的长度,建议加一个参数
    int fun( char * p_str, int size );
    这样就不容易出错了。
      

  4.   


    谢谢果然透彻!!
    减1的目的是去掉结束占用的内存空间,告诉GetWindowText可以写入29个字符,对吗?
    ....
    fun("abc");
    ....
    int fun(char * str){
        _strlwr_s(str, sizeof(str));     //这里会导致内存不能为Read, 这是什么原因?
    }
      

  5.   


    谢谢果然透彻!!
    减1的目的是去掉结束占用的内存空间,告诉GetWindowText可以写入29个字符,对吗?
    ....
    fun("abc");
    ....
    int fun(char * str){
        _strlwr_s(str, sizeof(str));     //这里会导致内存不能为Read, 这是什么原因?
    }
    同上啊~
      

  6.   


    谢谢果然透彻!!
    减1的目的是去掉结束占用的内存空间,告诉GetWindowText可以写入29个字符,对吗?
    ....
    fun("abc");
    ....
    int fun(char * str){
        _strlwr_s(str, sizeof(str));     //这里会导致内存不能为Read, 这是什么原因?
    }跟上面一样的道理!int fun(char * str){
        _strlwr_s(str, sizeof(str));     //这里会导致内存不能为Read, 这是什么原因?
    }
    ------------------------------------------------------------------------------>
    int fun(char * str){
        _strlwr_s(str, strlen(str));  
    }
      

  7.   


    谢谢果然透彻!!
    减1的目的是去掉结束占用的内存空间,告诉GetWindowText可以写入29个字符,对吗?
    ....
    fun("abc");
    ....
    int fun(char * str){
        _strlwr_s(str, sizeof(str));     //这里会导致内存不能为Read, 这是什么原因?
    }
    也是没内存空间啊楼主,函数的参数在任何时候都是个指针。
      

  8.   


    谢谢果然透彻!!
    减1的目的是去掉结束占用的内存空间,告诉GetWindowText可以写入29个字符,对吗?
    ....
    fun("abc");
    ....
    int fun(char * str){
        _strlwr_s(str, sizeof(str));     //这里会导致内存不能为Read, 这是什么原因?
    }看起来我还是没有说清楚,少说了一句:
     _strlwr_s(str, sizeof(str));这一句中的sizeof(str) ,LZ的本意是取字符串的长度3,但实际意义是取字符串地址的长度,类似int的长度,是4,输入的是“abc”,三个字符, _strlwr_s(str, sizeof(str));中传了个4,用了不该用的内存,所以出错了,改成fun("abcdefgh");就不会出错了,但是d以后的字符不会变大写。正确的写法是:
     _strlwr_s(str, len(str)); //len(str),取字符串的长度,我凭记忆写的,实际查一下。