博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C/C++里的const(1)
阅读量:6990 次
发布时间:2019-06-27

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

首先来看这样一段程序:

1 #include
2 using namespace std; 3 int main(){ 4 char *s = "hello world"; 5 6 cout << s << endl; 7 s[0] = 'B'; 8 cout << s << endl; 9 return 0;10 }

在VS2013下编译运行的结果是:

什么原因呢?

计算机中的内存在用于编程时,被进行了分区(Segment),分为:“栈区”(Stack)、“堆区”(Heap)、全局区(静态区,Static )、文字常量区和代码区。

使用*s定义的字符串存储在文字常量区内,这一部分是默认为为const类型的,因此不能修改。

当把程序改成如下,就可以得到想要的效果了。

1 #include
2 using namespace std; 3 int main(){ 4 //char *s = "hello world"; 5 char s[] = "hellow world"; 6 cout << s << endl; 7 s[0] = 'B'; 8 cout << s << endl; 9 while (1);10 return 0;11 }

运行结果:

通过打印一下两种方式的字符串首地址,跟容易发现问题所在。

修改后的程序:

1 #include
2 using namespace std; 3 int main(){ 4 char *s1 = "hello world"; 5 char s2[] = "hellow world"; 6 cout << &s1 << endl; 7 //s[0] = 'B'; 8 cout << &s2 << endl; 9 cout << &main << endl;10 while (1);11 return 0;12 }

运行结果:

可以发现由字符串定义的字符串被放到了很靠前的地址空间(栈区);而由指针定义的字符串与main函数地址很近。

 

转载于:https://www.cnblogs.com/jacklu/p/4394639.html

你可能感兴趣的文章
基于CentOS5.5的SVN服务器搭建
查看>>
maven使用笔记
查看>>
JBoss配置使项目能在局域网其他机子上访问项目
查看>>
VIO概述 On-Manifold Preintegration for Real-Time Visual--Inertial Odometry
查看>>
CocoaPods升级安装三方库报错
查看>>
SpringBoot整合RabbitMQ实现微服务间的异步消息沟通
查看>>
pku1338 Ugly Numbers
查看>>
程序算法与人生选择 分类: 转载收藏 2013...
查看>>
牛客网校招全国统一模拟笔试(三月场)- Java方向
查看>>
Apache主站点配置
查看>>
[转]蓝牙开发
查看>>
C语言程序举例
查看>>
$.param()的实例应用
查看>>
web安全:xss && csrf
查看>>
数据保存(永久保存)方式
查看>>
POJ 3320 尺取法(基础题)
查看>>
如何使表格中的文字不换行?多出的字用“..."代替
查看>>
c# 进程间通信
查看>>
Word Ladder
查看>>
ZigZag Conversion
查看>>