字符串常量

 

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://kimva.blogbus.com/logs/23557698.html

见下面例子:

int main()
{
    char *p = "1234";
    p[2] = '1';
    return 0;
}

编译时通过,但执行时发生coredump, 原因是试图修改字符串常量的值:  "1234"为一字符串常量,编译器有可能把它放在内存的只读区域,而p[2] = '1'试图对此字符串常量作修改,则会产生错误(当然啦,编译器也有不一定会把它放到只读区域,但这种情况应当避免)。。

另外,如果程序中有出现两个或更多的字面值完全相同的字符串,如:
        char *p1 = "house";
        char *p2 = "house";
        那么编译器也有可能将它们存储在相同的位置,即“共用同一个字符串常量”,这样的话,如果修改其中一个字符串,就会影响到其它字符串。
    然而,如果使用一个字符串来初始化一个数组,则是可以修改数组的内容的。
        char a[] = "house";
        s[0] = 'm';

 

转载自:

点击打开链接http://blog.csdn.net/andylyc/article/details/2046225

请在(且只能在TC2.0)中运行下面代码,先不要看结果,想想会得到什么:  
  #include<stdio.h>  
  #include<stdlib.h>  
   
  int  
  main(   int   argn,   char*   argv[]   )  
  {  
          char*   szStringA   =   "Hello,world!";  
          char*   szStringB   =   "Hello,world!";  
   
          *szStringA   =   '-';  
          puts(   szStringB   );  
   
          return   0;  
  }  
  输出结果是:"-ello,world!";。是否和你想象的结果不一样呢?  
  ANSI   C明确说明:修改字符串常量,效果是未定义的。  
  首先我们得清楚,如何才能得到字符串常量?只有一种方式:char*   szString   =   “Hello,world!”;这个声明得到一个字符串常量。那么char   szString[]   =   “Hello,world!”;可以吗?不可以!这样得到的是字符串变量。好了,回过来,由于ANSI   C没有要求编译器实现者如何具体对字符串常量进行处理,所以有些编译器会把相同的多个字符串常量看成一个(注意:这种优化仅有可能出现在字符串常量中,不要把泛泛的用于其他类型的常量。如:int   num1   =   11;int   num2   =   11;虽然是两个相同的常量,但是修改num1不会影响num2),目的是为了节约内存空间,所以上面的例子中,当修改字符串a时,b也被修改了。从这里可以看出,TC2.0有对字符串常量进行优化,而其他的编译器(如:DEVC++5.0)不一定也会优化,结果可能是无法通过编译,或者通过编译但是结果是垃圾值。由于这些种种不确定因素,我们应尽量避免修改字符串常量。  
  如果必须修改字符串就没有办法呢?有!一定有!请注意:我们要的效果是修改字符。因此,只需要定义字符串变量,而不是字符串常量。前面说过,可以用数组的方式定义char   szString[]   =   “Hello,world!”;;这样,在程序中就可以修改字符串了。  
  试试下面代码:  
  #include<stdio.h>  
  #include<stdlib.h>  
   
  int  
  main(   int   argn,   char*   argv[]   )  
  {  
          char   szStringA[]   =   "Hello,world!";  
          char   szStringB[]   =   "Hello,world!";  
   
          szStringA[0]   =   '-';  
          puts(   szStringB   );  
   
          return   0;  
  }  
  没问题了吧。  
  OK,最后请记住:需要修改字符串,那么用char   szString[]   =   “Hello,world!”;进行声名!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值