首页 > 代码库 > C中常量字符串使用以及g++的一个bug

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你值得尝试,却不必拥有。 

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