针对书《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
原创粉丝点击