由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 在c中如果一个function return 一个字符串
相关主题
what's wrong with this C++ code?C++ 初级再初级问题
问个字符串的基本问题请教一个const pointer的问题
四道C++面试题pydev里可以直接引用源程序吗
A question about cost char*这个在c++ const不变,不能用相同地址的变量改,咋做的
问个c语言的问题C 语言,初学者问题(3)
c字符串内存分配问题谁来解释一下这个是compiler问题吗?
C 语言,初学者,简单问题(2)写惯了C++ code,再写C code真不习惯
这个C++程序为什么不能运行问一个 char * 和 char [] 的问题
相关话题的讨论汇总
话题: test话题: tt话题: test1话题: 字符串话题: char
进入Programming版参与讨论
1 (共1页)
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
4
undefined
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。
相关主题
c字符串内存分配问题C++ 初级再初级问题
C 语言,初学者,简单问题(2)请教一个const pointer的问题
这个C++程序为什么不能运行pydev里可以直接引用源程序吗
进入Programming版参与讨论
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
1 (共1页)
进入Programming版参与讨论
相关主题
问一个 char * 和 char [] 的问题问个c语言的问题
问个指针array 的简单问题c字符串内存分配问题
char *p = "string literal"; 和 char a[] = "string liter (转载)C 语言,初学者,简单问题(2)
TIJ上写错了?这个C++程序为什么不能运行
what's wrong with this C++ code?C++ 初级再初级问题
问个字符串的基本问题请教一个const pointer的问题
四道C++面试题pydev里可以直接引用源程序吗
A question about cost char*这个在c++ const不变,不能用相同地址的变量改,咋做的
相关话题的讨论汇总
话题: test话题: tt话题: test1话题: 字符串话题: char