关于C++的一道题

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

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

阅读 4.8k
5 个回答

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

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

  • 自动存储: 在函数定义中声明的变量(包括函数参数)为自动存储的。
  • 静态存储: 在函数定义外定义的变量和使用关键字static定义的变量为静态存储的。
  • 线程存储(C++11)
  • 动态存储: 运行时用new运算符分配的内存,一直存在,直到delete运算符将其释放或程序结束为止,有时也被称为 自由存储

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

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

加一个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++中用string类型

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题