针对书《Linux高级编程》关于常量数据存储位置的问题
2017-03-14 22:26
459 查看
本书为Linux高级编程(第三版)杨宗德等著 人民邮电出版社
书上42页第6点数据常量:
编译运行过程如下:
这里插入一个Ubuntu用终端运行程序的解释:第一个Test是编译后的文件名,第二个是代码所在的文件名
重要的是,这里看不出测试字符串常量是否存储在同一地址,而且效果类似函数
运行结果一样,这时应该如何改才与书本对应呢,做一个简单的代码对比:
输出结果为:
最后可以确定(char *)指向的字符串是一个字符串常量保存在一个特定位置(代码段中),(char[])保存的是变量可以修改
书上42页第6点数据常量:
#include <stdio.h> char *a="hello"; void test(void) { char *c="hello"; if(a==c) //测试子函数中局部变量c和全局变量a是否指向同一字符串 printf("yes,a==c\n"); else printf("no,a!=c\n"); } int main(void) { char *b="hello"; char *d="hello1"; if(a==b) //测试a、b是否指向同一字符串 printf("yes,a==b\n"); else printf("no,a!=b\n"); test(); //在子函数中测试 if(a==d) //测试前几个字符串相同的两字符串是否优化存储在同一位置 printf("yes,a==d\n"); else printf("no,a!=d\n"); return 0; }
编译运行过程如下:
root@rhoda-Lenovo-N480:~/桌面# gcc -o Test Test.c root@rhoda-Lenovo-N480:~/桌面# ./Test yes,a==b yes,a==c no,a!=d
这里插入一个Ubuntu用终端运行程序的解释:第一个Test是编译后的文件名,第二个是代码所在的文件名
重要的是,这里看不出测试字符串常量是否存储在同一地址,而且效果类似函数
strcmp(str1,str2)但是要在文件头加
#include "string.h"代码如:
#include <stdio.h> #include "string.h" char *a="hello"; void test(void) { char *c="hello"; if(strcmp(a,c)==0) //测试子函数中局部变量c和全局变量a是否指向同一字符串 printf("yes,a==c\n"); else printf("no,a!=c\n"); } int main(void) { char *b="hello"; char *d="hello1"; if(strcmp(a,b)==0) //测试a、b是否指向同一字符串 printf("yes,a==b\n"); else printf("no,a!=b\n"); test(); //在子函数中测试 if(strcmp(a,d)==0) //测试前几个字符串相同的两字符串是否优化存储在同一位置 printf("yes,a==d\n"); else printf("no,a!=d\n"); return 0; }
运行结果一样,这时应该如何改才与书本对应呢,做一个简单的代码对比:
#include<stdio.h> void main() { //定义 char a[]="hello"; char b[]="hello"; char *c="hello"; char *d="hello"; //输出地址(十六进制) printf("对应的地址:\n"); printf("a=%p\n",a); printf("b=%p\n",b); printf("c=%p\n",c); printf("d=%p\n",d); printf("判断是否相等:\n"); if(a==b) printf("a==b\n"); else printf("a!=b\n"); if(c==d) printf("c==d\n"); else printf("c!=d\n"); //由于字符数组的值不是常量可以修改 a[1]='E'; //输出指向字符串 printf("对应的字符串:\n"); printf("a=%s\nb=%s\n",a,b); printf("c=%s\nd=%s\n",c,d); }
输出结果为:
对应的地址: a=0x7ffe50509ed0 b=0x7ffe50509ee0 c=0x400794 d=0x400794 判断是否相等: a!=b c==d 对应的字符串: a=hEllo b=hello c=hello d=hello
最后可以确定(char *)指向的字符串是一个字符串常量保存在一个特定位置(代码段中),(char[])保存的是变量可以修改
相关文章推荐
- 计算机内部如何存储数据,关于源码、补码的问题!
- 关于数据为NULL读取存储问题
- 关于复杂数据存储的问题--基础篇:数组以及浅拷贝与深拷贝的问题(上)
- 关于设备唯一标示UUID的问题与数据存储在KeyChain里边
- 关于NSuserdefault存储数据以及存储可变数据时的一些问题
- java笔记:关于复杂数据存储的问题--基础篇:数组以及浅拷贝与深拷贝的问题(上)
- 关于Extjs拥有了一对一的关系 或者一对多的关系的数据的存储问题
- 关于复杂数据存储的问题--基础篇:数组以及浅拷贝与深拷贝的问题(下)
- 关于PB12.5.NET设计存储过程型的数据窗口死机的问题
- 关于Java堆栈存储数据的问题
- 数据结构中,关于“大小端”的数据存储方式的相关问题
- 关于此主机当前没有管理网络冗余及数据存储数目为0的问题
- VMware vSphere Cluster的关于此主机当前没有管理网络冗余及数据存储数目为0的问题
- VMware vSphere Cluster的关于此主机当前没有管理网络冗余及数据存储数目为0的问题
- 关于“代码区,全局数据区,堆区,栈区”和“ 栈区,堆区,全局/静态存储区,常量存储区”两种不同的说法
- 关于复杂数据存储的问题--基础篇:数组以及浅拷贝与深拷贝的问题
- 关于51地图中循环根据经纬度获取地理位置只显示一条数据的问题
- C 语言编译过程 C语言中各种数据存储的不同内存区域 关于sizeof 结构体比实际的大的问题
- 关于sqlite断电或者存储空间不足造成的数据文件损坏问题-转
- 关于int类型数据在内存中的高低位存储问题