C中常量字符串使用以及g++的一个bug

const char*用于定义一个指向常量字符串的指针,通常形式为:

const char* ptr = "hello";

但可能很多粗心的朋友们没有注意到下面一种定义:

const char* ptr2 = "hello";

ptr和ptr2指向的是同一片内存,即定义const char* ptr = "hello"并不等于创建新的常量字符串,而是试图返回一个常量字符串的访问地址,如果常量字符串不存在就创建常量字符串并返回常量字符串的地址,这种说法并不全对。

const char*是一个指针,和常量字符串的获取和创建没有关系,访问和创建常量字符串是"hello"完成的,没错啦,是通过"hello"访问的常量字符串"hello",你随时随地可以通过"hello"获取指向"hello"的指针,"hello"在第一次被使用到的时候被创建,以后使用"hello"都是访问这块地址。

比如下面的例子:

static const char *
change_to_string(int change)
{
    change &= (EV_CHANGE_ADD|EV_CHANGE_DEL);
    if (change == EV_CHANGE_ADD) {
        return "add";
    } else if (change == EV_CHANGE_DEL) {
        return "del";
    } else if (change == 0) {
        return "none";
    } else {
        return "???";
    }
}

通过return的方式返回字符串常量,可以代替某些函数的static变量,很酷吧。

g++的bug

g++在处理常量字符串类型的返回值时存在bug,上面例子返回的是const char*,也是众所周知的安全访问字符串常量方式,但你也可以定义返回值类型为char*,是的,你可以定义为char*,并用一个char*的指针来接收它,突破了不能将const char*赋值给char*的限制,你做到了,你的码危险了,你修改常量字符串的时候就core了。

这个bug你值得尝试,却不必拥有。

时间: 2024-10-18 03:51:31

C中常量字符串使用以及g++的一个bug的相关文章

Python判断一个文件中的字符串是否存在于另外一个文件中

最近市场部的同事让我帮忙处理一个两个文件,判断A文件的内容是否在B文件中存在,如果存在则打印出B文件中的内容,想了下,就目前用shell很简单实现,用Python如何实现呢?下面是具体代码: shell代码: #!/bin/bash for line in `cat /root/zy/audiolist.txt` do       files=`cat /root/zy/list.txt|grep "$line"|wc -l`       if [ -n $files ]       

Java中的字符串常量池

最近做到一个题目: 问题:String str = new String("abc"),"abc"在内存中是怎么分配的?    答案是:堆,字符串常量区. 题目考查的为Java中的字符串常量池和JVM运行时数据区的相关概念."abc"为字面量对象,其存储在堆内存中.而字符串常量池则存储的是字符串对象的一个引用. Java中的字符串常量池 Java中字符串对象创建有两种形式,一种为字面量形式,如String str = "droid&qu

转载:Java中的字符串常量池详细介绍

引用自:http://blog.csdn.net/langhong8/article/details/50938041 这篇文章主要介绍了Java中的字符串常量池详细介绍,JVM为了减少字符串对象的重复创建,其维护了一个特殊的内存,这段内存被成为字符串常量池或者字符串字面量池,需要的朋友可以参考下 Java中字符串对象创建有两种形式,一种为字面量形式,如String str = "droid";,另一种就是使用new这种标准的构造对象的方法,如String str = new Stri

常用类库之.NET中的字符串

字符串的特性 1.不可变性 由于字符串是不可变的的,每次修改字符串,都是创建了一个单独字符串副本(拷贝了一个字符串副本).之所以发生改变只是因为指向了一块新的地址. 2.字符串池(只针对字符串常量) 当一个程序中有多个相同的字符串常量时,多个变量指向的是内存中同一块字符串!这个特性叫字符串池.之所以字符串,不会造成程序混乱,是因为字符串的不可变性. String的成员方法和属性 PS:这里重载方式很多,不一一列举. 1.Contains(String str) 判断字符串中是否包含,指定字符串.

java中的字符串简介,字符串的优化以及如何高效率的使用字符串

简介 String最为java中最重要的数据类型.字符串是软件开发中最重要的对象之一,通常,字符串对象在内存中总是占据着最大的空间块.所以,高效处理字符串,将提高系统的整个性能. 在java语言中,String对象可以认为是char数组的衍生和进一步的封装.它的主要组成部分是:char数组.偏移量和string的长度.char数组表示string的内容,它是string对象所表示字符串的超集.String的真实内容还需要偏移量和长度在这个char数组中进一步定位和截取.(查看java源代码可以看

关于Delphi中的字符串的详细分析

关于Delphi中的字符串的详细分析 只是浅浅的解析下,让大家可以快速的理解字符串. 其中的所有代码均在Delphi7下测试通过. Delphi 4,5,6,7中有字符串类型包括了: 短字符串(Short String) 长字符串(Long String) 宽字符串(Wide String) 零结尾字符串(Null-Terminated String).PChar和字符数组 1.短字符串(Short String) 固 定长度,最大字符数个数为255,短字符串也成为长度字节(Length-byt

Java中的字符串

作者:禅楼望月(http://www.cnblogs.com/yaoyinglong/) 1.字符串可以被GC回收了 我们之前在表达式的陷阱中就说到"对于Java程序中的字符直接量,JVM会使用一个字符串池来保护他们:当第一次使用某个字符串直接时,JVM会将它们放入字符串池进行缓存."在jdk1.7之前HotSpot将该字符串常量池放在永久代中,所以当初我们还说"在一般情况下,字符串缓冲池中字符串对象不会被垃圾回收",但是jdk1.7以后HotSpot就将字符串常量

linux sed 批量替换多个文件中的字符串

转载:http://blog.csdn.net/kauu/article/details/1757325 一.linux sed 批量替换多个文件中的字符串 sed -i "s/oldstring/newstring/g" `grep oldstring -rl yourdir` 例如:替换/home下所有文件中的www.bcak.com.cn为bcak.com.cn sed -i "s/www.bcak.com.cn/bcak.com.cn/g" `grep ww

c#中的字符串查找函数

indexOf()方法,查找某字符串在一个字符串内的位置,没有则返回-1string aa="abcdef";int a=aa.indexOf("bc");//a会等于1int b=aa.indexOf("a");//b会等于0int c=aa.indexOf("g");c会等于-1所以你只要判断返回出来的int值是不是小于0就知道这个字符串里有没有包含指定的另一个字符串 c#中的字符串查找函数,布布扣,bubuko.com