最近写程序的时候发现这样一个问题
#include<iostream> #include <string.h> using namespace std; void reverse(char *str) { int len=strlen(str); char *p=str; char *q=str+len-1; while(p<q) { char temp=*p; *p=*q; *q=temp; p++; q--; } } int main() { char *n1="123"; char n2[4]="456"; reverse(n1); reverse(n2); return 0; }
执行reverse(n1);的时候会出现下面的错误,而如果把这句注释掉执行reverse(n2);却能顺利运行
现在的主要问题是初始化一个字符数组和初始化一个指向字符串的指针的区别,前者可以通过指针改变字符串的单个内容,而后者却不可以,想不明白,于是查阅书籍,在
《C Primer Plus 第五版》 关于字符串的一章中找到了答案。
下面将程序进一步简化,以观察重点:
1、只在程序中写下面两句程序,程序顺利运行
char n1[4]="123"; n1[0]='1';
2、只在程序中写下面两句程序,程序运行出错,错误和上面的一样
char *n2="123"; n2[0]='1';
为什么会出错呢?书中给的解释是:编译器可能选取内存中同一个单个的拷贝来表示所有相同的字符串文字,如果允许用指针改变字符串的某些字符,会导致其他地方引用字符串出错。
书中给的建议是初始化字符串指针的时候使用const修饰,这样就可以避免在使用的时候发现错误了,当然这样只是将运行错误变成编译错误。