注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

落叶清风L的博客

努力向前

 
 
 

日志

 
 
 
 

C/C++中的字符串字面值常量  

2015-01-16 12:10:05|  分类: linuxC |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
         在C/C++ 中,都存在字符串字面值常量的说法,如 "abc" ,"defghi","1234" ...... 这些东西即已是常量,按常理来说,我们理解的话,应该是const char * 类型,是不可更改的.  对 , 就是不可更改的 , 可是还是有点疑问, 疑问来了 :
#include <stdio.h>
int main(int argc , char**argv) {
char *p = "abc" ;
*p = 'e' ;
return 0 ;
}
        这样,一打眼看过去 , 肯定出错么! 不用想 , 可是事实真的是这样吗?我的gcc 版本 :

[tutu@localhost string_constant]$ gcc --version

gcc (GCC) 4.8.3 20140911 (Red Hat 4.8.3-7)

Copyright (C) 2013 Free Software Foundation, Inc.

This is free software; see the source for copying conditions. There is NO

warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

        我们来编译一下, 在不加任何参数的情况下进行 :

[tutu@localhost string_constant]$ gcc string_constant.c

[tutu@localhost string_constant]$

        为毛连个警告都没有 ? 这就很奇怪了 , 我们加上警告不忽略试试 :

[tutu@localhost string_constant]$ gcc string_constant.c -Wall -Wextra

[tutu@localhost string_constant]$

        ... ... ... ... 就这么成功了 , 编译器没有任何反馈! 连个警告都没有 ! 真TM危险啊!!! 当然执行这个程序是会出问题的,由于字符串字面值常量是存放在.rodata(这个也有说放到.text里面的.) 自己调试了一下 , 修改了字符串字面值常量的长度 。main函数的地址没有变。下截图:
C/C++中的字符串字面值常量 - 萧然AND落叶清风L - 落叶清风L的博客
         先假定就在.rodata里 , 毕竟这不是我们讨论的重点。
         奇怪了, 在用C++编译一下:
C/C++中的字符串字面值常量 - 萧然AND落叶清风L - 落叶清风L的博客
         C++还是很和谐的。给出了警告 , 可是C 为什么没有给警告呢? 或者直接报错。不懂了。问了IRC #osdev的大神 , 大神确信地说 , gcc 悄悄地将const char * 转成 char * 了 , 相关细节在编译器说明文档中。提供了一个参数可以检测这样的错误出现 : gcc -Wwrite-strings 
C/C++中的字符串字面值常量 - 萧然AND落叶清风L - 落叶清风L的博客
 
这样就和g++ 给出的提示信息相同了, 几经周折 , 草率地得出一个结论 , gcc 在处理字符串字面值常量复制给char *时 , 将字符串字面值常量悄悄地当char * 对待了 , 没有报告任何警告和错误。 具体的细节,编译器的doc中应该有些吧, 小生暂未拜读 , 各路大神, 路过不吝指教啊 !  所以gcc 编译时 , 防止自己出现这样的低级错误 , 还是在Makefile 里link 和complie 时加上这个参数吧!

                                                                                                                                        --- windleaves
                                                                                                                                        15.1.16 : 12:09
  评论这张
 
阅读(59)| 评论(1)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018