char *p = "I AM A STUDENT";
p[3] = 0;
std::cout<<p;
应该是运行时会报错,为什么呢,c++小白求教
在回答之前,先给楼主提个意见:既然是
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
的内容是自动存储的。
首先来进行一下科普
"I AM A STUDENT"; 这货叫做字符串字面值。
那么什么叫字符串字面值呢?
字符串字面值是一串常量字符。 我们叫它字面值,是因为它没有名字,只能用它的值来称呼它;字面值都是常量。
任何尝试修改常量的行为都是有问题的。
将字符串字面值赋值给一个指针,仅仅是吧这个字符串字面值的首地址赋给了指针,不会发生任何内容的拷贝。
科普完毕,下面来说说程序中的错误
char *p = "I AM A STUDENT";
p[3] = 0; //错误!尝试修改字符串字面值。
正确的玩法:
char str[] = "I AM A STUDENT"; //用字符串字面值初始化一个char数组。
str[3] = '\0'; //修改char数组中第4个元素的值
std::cout << str;
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.5k 阅读
1 回答3.3k 阅读
p 的标准写法是
const char *p
, 即 p 是一个常量,向常量中写入数据所以会在运行时出错。可见:http://segmentfault.com/q/1010000000510488