定义指针char *p = "I AM A STUDENT"时,编译器并不为指针所指向的对象分配空间,它只是分配指针本身的空间,除非在定义时同时赋给指针一个字符串常量进行初始化。这里的字符串常量是静态存储的,而且被定义为只读。如果试图通过指针修改这个字符串常量的值,程序就会出现undefined behavior。所以,这里初始化指针时最好用const标记该指针指向的字符串为常量。
另外一个需要注意的是,定义数组char p[] = "I AM A STUDENT"时,数组p的内容是自动存储的。
char *p = "I AM A STUDENT"; p[3] = 0; //错误!尝试修改字符串字面值。 正确的玩法: char str[] = "I AM A STUDENT"; //用字符串字面值初始化一个char数组。 str[3] = '\0'; //修改char数组中第4个元素的值 std::cout << str;
p 的标准写法是
const char *p
, 即 p 是一个常量,向常量中写入数据所以会在运行时出错。可见:http://segmentfault.com/q/1010000000510488
首先要知道
C++
使用四种不同的方案来存储数据(它们的区别在于数据保留在内存中的时间):static
定义的变量为静态存储的。C++11
)new
运算符分配的内存,一直存在,直到delete
运算符将其释放或程序结束为止,有时也被称为 自由存储 或 堆。定义指针
char *p = "I AM A STUDENT"
时,编译器并不为指针所指向的对象分配空间,它只是分配指针本身的空间,除非在定义时同时赋给指针一个字符串常量进行初始化。这里的字符串常量是静态存储的,而且被定义为只读。如果试图通过指针修改这个字符串常量的值,程序就会出现undefined behavior。所以,这里初始化指针时最好用const
标记该指针指向的字符串为常量。另外一个需要注意的是,定义数组
char p[] = "I AM A STUDENT"
时,数组p
的内容是自动存储的。加一个const
首先来进行一下科普
"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;
建议在C++中用string类型