zoukankan      html  css  js  c++  java
  • c++ 字符串常量

    字符串常量。之所以称之为常量,由于它可一看作是一个没有命名的字符串且为常量,存放在静态数据区。
    这里说的静态数据区,是相对于堆、栈等动态数据区而言的。

    静态数据区存放的是全局变量和静态变量。从这一点上来说,字符串常量又能够称之为一个无名的静态变量,
    由于"Hello world!"这个字符串在函数 s1和s2 中都引用了。但在内存中却仅仅有一份拷贝,这与静态变量性质相当神似。
    char *c="chenxi";
    书上说: "chenxi"这个字符串被当作常量并且被放置在此程序的内存静态区。
    那一般的int i=1;
    1也是常量,为什么1就不被放置在此程序的内存静态区了呢?
    请高手指点。
    全部的字符窜常量都被放在静态内存区
    由于字符串常量非常少须要改动。放在静态内存区会提高效率
    例:
    <span style="font-size:18px;">char str1[] = "abc";
    char str2[] = "abc";
    const char str3[] = "abc";
    const char str4[] = "abc";
    const char *str5 = "abc";
    const char *str6 = "abc";
    char *str7 = "abc";
    char *str8 = "abc";
    cout << ( str1 == str2 ) << endl;
    cout << ( str3 == str4 ) << endl;
    cout << ( str5 == str6 ) << endl;
    cout << ( str7 == str8 ) << endl;</span>

    结果是:0 0 1 1
    str1,str2,str3,str4是数组变量。它们有各自的内存空间;

    而str5,str6,str7,str8是指针,它们指向同样的常量区域。


    问题的引入:
    看看以下的程序的输出:
    #include <stdio.h>
    char *returnStr()
    {
     char *p="hello world!";
     return p;
    }
    int main()
    {
     char *str=NULL;//一定要初始化,好习惯
     str=returnStr();
     printf("%s
    ", str);
     
     return 0;
    }

    这个没有不论什么问题。由于"hello world!"是一个字符串常量,存放在静态数据区。
    把该字符串常量存放的静态数据区的首地址赋值给了指针。
    所以returnStr函数退出时。该该字符串常量所在内存不会被回收。故可以通过指针顺利无误的訪问。



    可是,以下的就有问题:

    #include <stdio.h>
    char *returnStr()
    {
     char p[]="hello world!";
     return p;
    }
    int main()
    {
     char *str=NULL;//一定要初始化,好习惯
     str=returnStr();
     printf("%s
    ", str);
     
     return 0;
    }
    "hello world!"是一个字符串常量,存放在静态数据区,没错。
    可是把一个字符串常量赋值给了一个局部变量(char []型数组),该局部变量存放在栈中,
    这样就有两块内容一样的内存,也就是说“char p[]="hello world!";”这条语句让“hello world!”这个字符串在内存中有两份拷贝,一份在动态分配的栈中,还有一份在静态存储区。这是与前者最本质的差别,
    当returnStr函数退出时,栈要清空,局部变量的内存也被清空了。
    所以这时的函数返回的是一个已被释放的内存地址。所以打印出来的是乱码。


    假设函数的返回值非要是一个局部变量的地址,那么该局部变量一定要申明为static类型。

    例如以下:

    #include <stdio.h>
    char *returnStr()
    {
     	static char p[]="hello world!"; //存放在静态存储区
     	return p;
    }
    int main()
    {
     	char *str=NULL;
     	str=returnStr();
    	 printf("%s
    ", str);
     	return 0;
    }


  • 相关阅读:
    tableviewCell折叠状态1
    iOS中--NSArray调用方法详解 (李洪强)
    NSNumber的使用
    Fedora13下编译busybox-1.15.0出现can not find lcrypt错误
    【独立开发人员er Cocos2d-x实战 013】Cocos2dx 网络编程实战之星座运势
    JAVA序列化的作用
    我买网B轮融资成功,五周年豪掷千万回馈会员
    一步步教你搭建TinyOS2.1.2开发环境
    POJ2947 DAZE [Gauss]
    慢慢理解RESTful架构
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/7246880.html
Copyright © 2011-2022 走看看