char *str="abcdef";
这里的str是一个指针,指向的"abcdef"是只读数据,默认不允许修改。
char str[7]="abcdef";
这里的str是一个数组,初始化为"abcdef",是可读写的。

解决方案 »

  1.   

    不是指针要定义为常量,而是"abcde"本身不是指针,而是一个字符串常量
    至于TC,他出来时还没有标准那,哪有支持啥标准的问题?
    TC已经过时超过10年了,学习TC只是自己给自己下绊子,赶快把TC和和TC相关的书扔了
      

  2.   


    我用的是VC
    听说VC支持标准也不是很好,能不能推荐个好点的编译器啊?
      

  3.   

    就是为什么用char *str="abcdef"就是只读数据呢?
    用char str[]=就不是呢?
      

  4.   

    DOS下没有内存保护机制,所以TC可以这样做。在Windows下有内存保护机制,字符串常量是在只读区中分配的,char *str="abcdef"是定义一个指针变量,初始化为指向一个字符串常量,所以不能改写,char str[]=是定义一个字符数组并赋初值,字符数组(如果没有const修饰)是可以改写的。
      

  5.   


    注意你上面的这个代码:    string -=2; 
        while (left  < string) 
        { 
            ch = *left; 
            *left++=*string; // 这里,你的left是指向原来的字符串的开始, 你原来的字符串本来是只读的,所以你用*left = *string去修改他就回报错.
            *string--= ch; 
        } 修改为数组形式后就没有这个问题了.
      

  6.   

    五大内存分区   在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。   栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。   堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。   自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。   全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。   常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改
      

  7.   

    因为char str[]建立的是一个数组,str的内容是"abcdef"的一个可读可写的副本,因此和"abcdef"本身就没有任何关系了(出了值相等)而char * str方式,str是直接指向"abcdef"的,只要"abcdef"是只读的,他也是只读的
      

  8.   

    其实是不是支持标准并不重要,重要的是市场上使用的情况。如果一个编译器被市场广泛使用,你就该使用他。至于是不是支持标准,你又不是做C++理论研究的,对你有什么意义那?你无非是想靠这个混口饭吃而已(如果你是做理论研究的另说)至于VC,现在最新版本是VC2008,如果你是vc6,那就太老了
      

  9.   

    楼主的问题也不是对“标准”的支持不同引起的。TC估计在这个问题上和VC也一样,只是要注意:有错误不代表错误一定会显示给你。“程序不报错就认为是对的”,这种风格本身就有问题。
      

  10.   

    char *str="abcdef"; 
    这里的str是一个指针,指向的"abcdef"是只读数据,默认不允许修改。 
    char str[7]="abcdef"; 
    这里的str是一个数组,初始化为"abcdef",是可读写的。
    可以这么理解啊 
    但是,指针读的是它的地址,地址是不变的,
      

  11.   

    *string--= ch; 这句有问题
    8楼说的应该是对某个具体编译环境而言的,因为标准C++里根本没有这些概念
    只有三种内存区域
    不过了解更好
      

  12.   


    第一个主函数中的字符串为常量字符串,你要在子函数中更改它的值,当然通不过;第二个就不存在这个问题。这个与指针或数组没有联系,而是你更改“const”的问题。