针对书《Linux高级编程》关于常量数据存储位置的问题
来源:互联网 发布:外国诗歌流派 知乎 编辑:程序博客网 时间:2024/05/16 01:35
本书为Linux高级编程(第三版)杨宗德等著 人民邮电出版社
书上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.croot@rhoda-Lenovo-N480:~/桌面# ./Testyes,a==byes,a==cno,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=0x7ffe50509ed0b=0x7ffe50509ee0c=0x400794d=0x400794判断是否相等:a!=bc==d对应的字符串:a=hEllob=helloc=hellod=hello
最后可以确定(char *)指向的字符串是一个字符串常量保存在一个特定位置(代码段中),(char[])保存的是变量可以修改
1 0
- 针对书《Linux高级编程》关于常量数据存储位置的问题
- C语言 字符常量的存储位置问题
- Java知识:数据存储位置&常量池
- 变量,常量,静态变量存储的位置
- 变量、常量、静态变量的存储位置
- 才搞清楚常量的存储位置
- 变量,常量,静态变量存储的位置
- 变量,常量,静态变量存储的位置
- 变量,常量,静态变量存储的位置
- 才搞清楚常量的存储位置
- 针对树状表数据的存储
- 编程点滴-关于boolean常量在判断中的位置
- 关于数据存储的问题总结
- 关于Java堆栈存储数据的问题
- JAVA数据的存储位置
- 变量 常量等存储位置
- 关于常量字符串的问题
- IO高级编程——获取特定位置上的数据(lseek函数的使用)
- 用express搭建一个简单的博客系统
- JDK1.5新特性
- 【bzoj 1878】[SDOI2009]HH的项链
- ffmpeg--日志
- SpringBoot注解
- 针对书《Linux高级编程》关于常量数据存储位置的问题
- Partitioning by Palindromes UVA
- 43.左旋转字符串
- 第二次实验1 选择 (本月天数) 循环:(百钱白鸡)
- PAT1030完美数列
- 线性回归
- Spring源码学习--WebApplicationContext(十一)
- iOS Xcode真机调试设备连接时,Divice里面一直提示“iphone名称” is busy: Processing symbol files.
- No resource found that matches the given name 'android:Theme.Material.Light.DarkActionBar'