s******5 发帖数: 141 | 1 int main(){
cout<
cout<
}
char* test1(){
char* tt = "test";
return tt;
}
char* test2(){
char tt[] = "TEST";
return tt;
}
为什么test1会正确的返回tt呢?它指向的不应该是local变量么?
多谢。 |
G****A 发帖数: 4160 | 2 我的理解(新手):
指针变量的存贮是dynamically assigned的,delete [] tt 之前好像一直存在。
【在 s******5 的大作中提到】 : int main(){ : cout<: cout<: } : char* test1(){ : char* tt = "test"; : return tt; : } : char* test2(){ : char tt[] = "TEST";
|
s******5 发帖数: 141 | 3 这样的话,那么每次char* test = "test" 这样的赋值后是不是都要delete? 我一直以
为只有用new/malloc分配出来的才会
在heap上。
【在 G****A 的大作中提到】 : 我的理解(新手): : 指针变量的存贮是dynamically assigned的,delete [] tt 之前好像一直存在。
|
z****e 发帖数: 2024 | |
c*******t 发帖数: 13 | 5 undefined behavior
不过主流开发环境中优化之后,test1中的字符串放在只读数据段中,函数返回后数据
依然有效,而test2中的字符串在栈上。
【在 s******5 的大作中提到】 : int main(){ : cout<: cout<: } : char* test1(){ : char* tt = "test"; : return tt; : } : char* test2(){ : char tt[] = "TEST";
|
d*******o 发帖数: 5897 | 6 楼主确定test1会返回正确的结果?怎么我觉得test1和test2都不可靠? |
P********e 发帖数: 2610 | 7 你是对的.
"test"算是const data,应该在stack,不能修改,也不用free
【在 s******5 的大作中提到】 : 这样的话,那么每次char* test = "test" 这样的赋值后是不是都要delete? 我一直以 : 为只有用new/malloc分配出来的才会 : 在heap上。
|
r****o 发帖数: 1950 | 8 我有两次面试都问到这题,我说test1()的结果unpredictable,面试官也没说什么,
是不是还是应该说打印出"test"比较好?
【在 s******5 的大作中提到】 : int main(){ : cout<: cout<: } : char* test1(){ : char* tt = "test"; : return tt; : } : char* test2(){ : char tt[] = "TEST";
|
y**i 发帖数: 1112 | 9 第一个应该是合法的,应该只是不推荐
【在 r****o 的大作中提到】 : 我有两次面试都问到这题,我说test1()的结果unpredictable,面试官也没说什么, : 是不是还是应该说打印出"test"比较好?
|
b********h 发帖数: 119 | 10 第一个应该是string literal吧。结果是defined,必然打印出test。 |
|
|
t****t 发帖数: 6806 | 11 这么高的楼, 只有你一个人说得对, sigh
【在 b********h 的大作中提到】 : 第一个应该是string literal吧。结果是defined,必然打印出test。
|
z****e 发帖数: 2024 | 12 恩string literal, 我应该再仔细。
【在 t****t 的大作中提到】 : 这么高的楼, 只有你一个人说得对, sigh
|
f******y 发帖数: 2971 | 13 so many ppl ask this same question, again and again ... |
r*****l 发帖数: 110 | 14 网上查了一下:
(1)char *tt = "test";
字符串常量“test”被保存在静态存储区。tt保存的是“test”在静态存储区中的地址
。当函数结束后,静态存储区中的“test”没有被free。所以地址返回有效。
(2)char tt[] = “Test”;
这个比(1)多了一层含义。"Test"还是被保存在静态存储区。但是还有一份它的copy
被复制给了局部变量tt。函数返回的是这个局部变量tt。所以会出错。
(3)如果将(2)改为
static char tt[] = “Test”;
就和(1)是一样的效果了(因为放在静态存储区了)。 |
r****t 发帖数: 10904 | 15 为啥不推荐?我只记得 string end with '\0',所以 test1 是没问题的。
啥 string literal 什么的都没学过。
【在 y**i 的大作中提到】 : 第一个应该是合法的,应该只是不推荐
|
y**i 发帖数: 1112 | 16 第一个确实是字符串常量,但是返回的时候是一个char*,那么在不知情(不知道函数
体内部)的情况下,有可能会尝试修改这个字符串常量,最好返回const char*。
第二个我印象中会有一个字符串常量"TEST"在常量区产生,如楼上所说,还是直接写到
字符数组中?有点记不得了。
C++中字符串常量(string literal)会保存在一个常量区,以后如果产生同样的字符串
常量,将会先在这个常量区里面查找,如果找到,就会直接返回这个已有常量的地址。
【在 r****t 的大作中提到】 : 为啥不推荐?我只记得 string end with '\0',所以 test1 是没问题的。 : 啥 string literal 什么的都没学过。
|
r****t 发帖数: 10904 | 17 今天编译某个别人的程序,发现现在 test1 这种写法编译应该已经有 warning 了:
warning: deprecated conversion from string constant to 'char*'
test2 是怎么回事俺还没明白。。。
【在 y**i 的大作中提到】 : 第一个确实是字符串常量,但是返回的时候是一个char*,那么在不知情(不知道函数 : 体内部)的情况下,有可能会尝试修改这个字符串常量,最好返回const char*。 : 第二个我印象中会有一个字符串常量"TEST"在常量区产生,如楼上所说,还是直接写到 : 字符数组中?有点记不得了。 : C++中字符串常量(string literal)会保存在一个常量区,以后如果产生同样的字符串 : 常量,将会先在这个常量区里面查找,如果找到,就会直接返回这个已有常量的地址。
|
r****t 发帖数: 10904 | |