c语言字符串字面值,C++字符串字面值常量解析(string literal)

首先本文的对象是这么一段代码:

char * getResult0()

{

char *s = "This is a string";

return s;

}

char * getResult1()

{

char s[] = "This is a string";

return s;

}

两段代码非常相似,但是函数getRsult0返回的是字面值字符数组,函数getResult1返回的是静态数组。静态数组在栈上面分配的,因此函数返回的时候,已经不存在了,返回的指针悬空,因此编译报错!但是getResult0编译运行完全没有问题,这与字符串字面值的特殊性有着重要的关系!

字符串字面常量不同于普通的局部变量,具有static duration lifetime,这整个程序的生命周期中都将存在

原文出自 : C99 standard 6.4.5/5 "String Literals - Semantics":

The multibyte character sequence is then used to initialize an array of static storage duration and length just sufficient to contain the sequence.

为验证上面的结论,看一下代码:

#include#include#includeusing namespace std;

char * getResult()

{

//返回静态字符数组

char *s= "This is a string";

return s;

}

char * otherResult()

{

//返回动态分配字符数组

char *s = new char[17];

strcpy(s,"This is a string");

return s;

}

int main()

{

char *s = getResult();

cout << "Adress is : " << (int)s <

其执行结果如下:

Adress is : 1734656 Value is :This is a string

Adress is : 2249944 Value is :This is a string

Adress is : 1734656 Value is :This is a string

Adress is : 4520584 Value is :0

Adress is : 00225528 Value is :0

请按任意键继续. . .不同机器上执行的地址是不同的!每次运行相同的程序结果也会有差异。

s和k的地址是相同的,因为内容完全相同,这就说明返回字符串字面常量的时候,该字面常量是在一段特殊的区域叫只读存储区分配的,不同于普通的静态数组和内置类型,这些在栈上面分配,并且有编译器去管理释放。

C++返回指针,不能返回指向局部对象的指针!!!但是字符串字面常量不是局部对象,而是在整个程序生命周期中都存在的静态常量。因此可以返回指向该地址的引用!明显可以看出,a,b,k,t内存区域都相差很大,因为他们作用域不同。通过这些结果能够大致了解C++字面字符串常量!

t是动态分配的,不是常量,是堆上分配的空间。堆上面分配的空间和普通类型的局部变量的生命周期是不一样的,须有程序员主动的释放。

给一条stackoverflow上面的问答链接,感兴趣的可以看看:

life-time-of-string-literal-in-c

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值