none
这两行程序为什么无法执行:char * pc = "asdf" ; * pc = 'b'; RRS feed

  • 问题

  • // Pointer.cpp : Defines the entry point for the console application.
    // 指针实验
    
    #include "stdafx.h"
    using namespace std;
    int main(int argc, char* argv[])
    {
    		 char * pc = "asdf" ;
    		 * pc = 'b';		//此行无法正确执行
         * (pc+1) = 'c';
    		 cout << pc <<endl;
    	system("pause");
    	return 0;
    }
    
    

    开发环境:VC++6.0 sp6

    错误提示:First-chance exception in Pointer.exe: 0xC0000005: Access Violation.

    2010年4月20日 9:40

答案

  • 因为"asdf"是一个常字符串,
    char * pc = "asdf" ;只是将常字符串的地址赋给pc。
    所以不能修改常字符串的内容

     

    可以这样处理
     char pc[] = "asdf" ;//开辟一个字符串空间,并将"asdf"拷贝到空间里。这样就可以修改pc的内容了

    • 已标记为答案 hooluupog 2010年4月21日 0:51
    2010年4月20日 15:21
  • #include "stdafx.h"
    using namespace std;
    int main(int argc, char* argv[])
    {
    char * pc = "asdf" ;
    * pc = 'b'; //此行无法正确执行
         * (pc+1) = 'c';
    cout << pc <<endl;
    system("pause");
    return 0;
    }

    字符串文字量的类型是“适当个数的const字符的数组”,那样做的话意味着企图更改const定义的常量的值。

    • 已标记为答案 hooluupog 2010年4月21日 0:51
    2010年4月20日 17:14
  • char * const pc = "asdf"//指针名前加const定义指针常量
    pc = "dfgh";             //error:指针常量不能改变其指针值
    * pc = 'b';               //ok: pc内容为“bsdf”
    * (pc+1) = 'c';           // ok: pc内容为“bcdf”

    pc = "dfgh"; 的操作并不是要修改字符串"asdf",而是要修改指针pc的值。

    *const 把pc定义为常量指针,即指针pc是一个const常量,因此不能将"dfgh"的地址赋给pc。

    • 已标记为答案 hooluupog 2010年4月21日 0:52
    2010年4月20日 17:27

全部回复

  • pc = 'b'; 是可以执行的。

    由char* pc = "asdf"; 可知pc 是一个指向固定字符串数组的指针。pc = 'b'; 可以执行是因为,此时是让pc指针指向了另一个固定字符'b'。 *pc 指向的实际上是字符常量'a',你把'b'赋值给常量'a', 当然报错啦。

    2010年4月20日 10:52
    版主
  • 谢谢回答。这个程序是钱能的C++程序设计教程那本书上面的例子程序。

    原来的程序是

     char * const pc = "asdf" ;  //指针名前加const定义指针常量
     pc = "dfgh";             //error:指针常量不能改变其指针值
     * pc = 'b';               //ok: pc内容为“bsdf”
     * (pc+1) = 'c';           // ok: pc内容为“bcdf”

    但是无法执行,是不是由于对常字符串("asdf")进行了修改,而长字符串是不允许修改的?也就是说这个例子程序是个错的?

    2010年4月20日 11:07
  • 因为"asdf"是一个常字符串,
    char * pc = "asdf" ;只是将常字符串的地址赋给pc。
    所以不能修改常字符串的内容

     

    可以这样处理
     char pc[] = "asdf" ;//开辟一个字符串空间,并将"asdf"拷贝到空间里。这样就可以修改pc的内容了

    • 已标记为答案 hooluupog 2010年4月21日 0:51
    2010年4月20日 15:21
  • #include "stdafx.h"
    using namespace std;
    int main(int argc, char* argv[])
    {
    char * pc = "asdf" ;
    * pc = 'b'; //此行无法正确执行
         * (pc+1) = 'c';
    cout << pc <<endl;
    system("pause");
    return 0;
    }

    字符串文字量的类型是“适当个数的const字符的数组”,那样做的话意味着企图更改const定义的常量的值。

    • 已标记为答案 hooluupog 2010年4月21日 0:51
    2010年4月20日 17:14
  • char * const pc = "asdf"//指针名前加const定义指针常量
    pc = "dfgh";             //error:指针常量不能改变其指针值
    * pc = 'b';               //ok: pc内容为“bsdf”
    * (pc+1) = 'c';           // ok: pc内容为“bcdf”

    pc = "dfgh"; 的操作并不是要修改字符串"asdf",而是要修改指针pc的值。

    *const 把pc定义为常量指针,即指针pc是一个const常量,因此不能将"dfgh"的地址赋给pc。

    • 已标记为答案 hooluupog 2010年4月21日 0:52
    2010年4月20日 17:27