字符串常数有些编译器将相同的字符串常数视为一个(节省空间),有些编译器不执行此优化//1。 字符串常数vs中可共享的void test01 ) ) {char * p1='hello world '; char * p2='hello world '; char * p3='hello world '; printf(%d(n ),) hello world ); printf(%d(n )、p1 ); printf(%d(n )、p2 ); printf(%d(n )、p3 ); }
33558www.Sina.com/(vs环境下) voidteST01 ) char*P1='Helloworld '; //字符串常数,指针p1是该字符串的起始地址printf(%dn )、p1 ); printf(%c(n ),p1[0]; //p1[0]='W '; //不允许更改常量字段的内容printf(%s(n )、p1 )。 //无法打印,程序错误}这里的字符串“hello world”位于常量区域,指针变量p1被定义为指向该常量区域,但常量区域的数据不能更改;
在上述情况下,字符串常数的修正失败,但这不是绝对的
一些编译器将多个相同的字符串常量视为一个“节省空间”,而其他编译器则在不进行此优化的ANSI C中进行了规定。 变更字符串常数的结果,有的编译器可以变更字符串常数,也有字符串常数字符串变量void test 02 { char P1 [ ]=' hello world '; printf(%d(n )、p1 ); printf(%c(n ),p1[0]; p1[0]='W '; 允许修改//printf(%s(n ),p1 ); //打印输出Wello world}这里的p1是相当于字符串变量的字符数组。 字符串" hello world "位于常量区域,但在函数调用时定义了用于存储字符串的字符数组p1,并将其从常量区域复制到堆栈区域。 实际修正不是常数区域的" hello world ",而是修正堆栈区域的字符数组的数据,所以修正成功,能够进行通常的打印输出
总结:避免修改字符串常量; 通常,不能修改字符串常量。 强制修复程序报告错误或崩溃,但某些编译器允许修复