char *s = "string literal";
题外话:我的名字literal就是字面值。
这个在C语言才能过编译(理论上),C++要报错,因为字符串字面值常量的类型是const char*,隐式转换不能去掉const属性,再因为C语言接口还有很多char*,C艹提供了const_cast来强转转换去掉const,只能自己约束自己只用在兼容代码上,不然就是未定义行为。
C语言中,虽然s看起来可以往里头写,然而标准中不做出任何保证,你可以读取,你要是写就是未定义行为。(此时发生什么都有可能)

Follow

@literalkernel 好吧...反正老师讲课的时候就只是提了一嘴字符串,和string.h的库,以及让我们不要用字符串操作。年幼无知的我们根本不知道这背后的坑有多大...
晚安

· · Web · 2 · 0 · 0

@mao 我只查到标准说 string literal 是 static storage ,然而 static storage 是指整个程序生命周期可见,程序初始化时初始化对象,也没说不能写值,不能写值是 6.7.9 节 EXAMPLE 8 里头说了一句写值是未定义行为。。。里面坑还挺深。

@mao 才发现,不要用字符串操作哈哈哈,我们老师那就"不负责任"了,另外我觉得搞清楚后不是太难,虽然很迷惑。

@literalkernel 嗯,现在大致清楚(反正就申请一块较大/合适的字符数组扔进去慢慢处理),越发的想开始自学python :pio_fue:

@mao 字符数组还是局部变量,或者在全局作用域试试,返回局部对象指针或引用也是个坑

Sign in to participate in the conversation
小森林

每个人都有属于自己的一片森林,也许我们从来不曾走过,但它一直在那里,总会在那里。迷失的人迷失了,相逢的人会再相逢。愿这里,成为属于你的小森林。