首页 > 关于C++的一道题

关于C++的一道题

char *p = "I AM A STUDENT";
p[3] = 0;
std::cout<<p;

应该是运行时会报错,为什么呢,c++小白求教


加一个const


首先来进行一下科普

  1. "I AM A STUDENT"; 这货叫做字符串字面值。

  2. 那么什么叫字符串字面值呢?

     字符串字面值是一串常量字符。 我们叫它字面值,是因为它没有名字,只能用它的值来称呼它;字面值都是常量。
  3. 任何尝试修改常量的行为都是有问题的。

  4. 将字符串字面值赋值给一个指针,仅仅是吧这个字符串字面值的首地址赋给了指针,不会发生任何内容的拷贝。
    科普完毕,下面来说说程序中的错误

char *p = "I AM A STUDENT";
p[3] = 0; //错误!尝试修改字符串字面值。
正确的玩法:
char str[] = "I AM A STUDENT"; //用字符串字面值初始化一个char数组。
str[3] = '\0'; //修改char数组中第4个元素的值
std::cout << str;


在回答之前,先给楼主提个意见:既然是C++问题,那就应该尽量使用STL,如string,vector

首先要知道C++使用四种不同的方案来存储数据(它们的区别在于数据保留在内存中的时间):

定义指针char *p = "I AM A STUDENT"时,编译器并不为指针所指向的对象分配空间,它只是分配指针本身的空间,除非在定义时同时赋给指针一个字符串常量进行初始化。这里的字符串常量是静态存储的,而且被定义为只读。如果试图通过指针修改这个字符串常量的值,程序就会出现undefined behavior。所以,这里初始化指针时最好用const标记该指针指向的字符串为常量。

另外一个需要注意的是,定义数组char p[] = "I AM A STUDENT"时,数组p的内容是自动存储的。


建议在C++中用string类型


p 的标准写法是 const char *p, 即 p 是一个常量,向常量中写入数据所以会在运行时出错。

可见:http://.com/q/1010000000510488

【热门文章】
【热门文章】