博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C语言中关于字符串常量的进一步分析 <转>
阅读量:6069 次
发布时间:2019-06-20

本文共 1372 字,大约阅读时间需要 4 分钟。

请在(且只能在TC2.0)中运行下面代码,先不要看结果,想想会得到什么:

#include
#include
// 文章要求代码在Tc下运行 int main(int argn, char* argv[]){ char* szStringA = "Hello,world!"; char* szStringB = "Hello,world!"; *szStringA = '-'; // dev下上面的语句在执行过程中异常退出,说明dev并不允许改变字符串常量, dev下,如果查看szStringA 和 szStringB的值的话,这两个指针的值话,也是一样的 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
#include
int main(int argn, char* argv[]){ char szStringA[] = "Hello,world!"; char szStringB[] = "Hello,world!"; // 这样其实是声明了一个数组大小由后面初始化常量决定的字符数组变量 *szStringA = '-'; puts(szStringB); return 0;}

这样的代码能够在dev下面运行,而且看起来是修改了一个常量.

转自:

转载于:https://www.cnblogs.com/Lyush/archive/2013/01/09/2852361.html

你可能感兴趣的文章
vscode常用设置
查看>>
程序员之---C语言细节20(符号和有符号之间转换、两数相加溢出后数值计算)...
查看>>
zookeeper学习
查看>>
【mac】mac上安装软件,报错 鉴定错误,但是安装包都是好的
查看>>
设计模式的6大原则
查看>>
【转】观看视频时启用硬件加速有什么用?如果关闭硬件加速又有什么区别呢?...
查看>>
Weblogic12c 单节点安装
查看>>
CentOS7下安装Docker-Compose操作记录
查看>>
【wpf】在win10系统上弹出toast和notification
查看>>
.axf 转化 .bin文件 的方法
查看>>
sql server无log ldf日志文件附件mdf数据库重新生成ldf日志文件
查看>>
Chapter 4 Invitations——15
查看>>
Spring Boot 2.0 Release Notes
查看>>
谈一谈python的垃圾回收机制
查看>>
windows上使用的免费连接linux终端xshell6,xftp6下载
查看>>
LeetCode 总结
查看>>
在Linux 中安装不了程序?教你一招解决!
查看>>
取得汉字拼音首字母的绝妙方法
查看>>
不再以讹传讹 剖析720P 1080i和1080P
查看>>
asp.net服务器控件button先执行js再执行后台的方法
查看>>