struct A {
char f1() {return *c;} // 1) f1() is rvalue
char * f2(){return c;} // 2) f1() is rvalue
char & f3(){return *c;} // 3) f1() is lvalue
char * c;
};
int main () {
char * a = "string"; // 4) it can be readable, when writed to a, problem will crash, why ?
const char * ab = "string"; // 5) ab is READ-ONLY
}
问题
a)对于第2行)为什么带指针返回类型的函数是rvalue,而不是左值?
b)对于第4)和第5行,什么是“字符串”的类型?一个“常见问题*”?更多有趣的知识,它位于哪个内存部位?
答案 0 :(得分:3)
为什么带指针返回类型的函数是rvalue,而不是左值?
因为指针是一个对象,如果返回类型是一个对象类型,函数调用的结果总是 rvalue 。取消引用指针将给出左值表示它指向的对象。
当写入a时,问题会崩溃,为什么?
因为字符串文字是const
,并且写入它们会给出未定义的行为。在现代C ++中,没有隐式转换为非const char*
,因此您的示例不会编译。从历史上看,这种狡猾的转变是出于神秘的原因。我建议你考虑使用一个更新的编译器,指定C ++ 11或C ++ 14作为语言方言,以防止这种肮脏。至少,启用编译器警告。
"string"
的真正含义是什么?
一个常量字符数组,大小足以容纳字符串文字中的字符加零终结符。在这种情况下,char const[7]
。
更多知道,它位于哪个内存部位?
字符串文字是常量,并且具有静态存储持续时间,因此通常存储在只读数据段中。没有具体说明具有相同值的两个文字是指同一个静态数组,还是两个独立的数组。
答案 1 :(得分:1)
a)第2行返回类型(char *)中的一些右值。它是(char *)的右值.char *只是一个类似int或char.in第3行它是左值,因为有(char&并且它发送回参考(左值)。
b)“string”是一个const char *变量,因为你不能用char *读取或写入,如果你尝试,你会触发未定义的行为。
答案 2 :(得分:1)
char f1() {return *c;} // 1) f1() is rvalue
* c是指针c指向的值
char * f2(){return c;} // 2) f1() is rvalue
f2()现在指向c指向的地址,现在是* f2()保存c指向的值。
答案 3 :(得分:1)
当写入a时,问题会崩溃,为什么?
Attempting to modify a string literal results in undefined behavior
代表cppreference。在相关的说明中,在c ++ 03中不推荐将字符串文字指定给非const char指针,并且自c ++ 11以来一直禁止使用。
a)您可能是指函数返回的值。副本返回的值始终是右值。
b)文字"string"
的类型为const char[7]
,并且具有静态存储持续时间。 通常存储在只读数据段中,例如.rodata
,但未由语言指定。
答案 4 :(得分:0)
a)函数char* f2()
返回一个值(粗略地说,一个代表内存地址的数字)。与返回值(另一个数字)的函数char f1()
相同。
函数char& f3()
返回对变量的引用。
const char[7]
,对于现代编译器(C ++ 11),第一项任务是非法的。第一个字符's'的内存位置可以轻松读入ab
。