关于返回指针。。。。。(在线等待。。。

battlet 2002-10-18 12:44:58
char *GetString(void)
{
char p[] = "hello world";
return p; // 编译器将提出警告
}
void Test4(void)
{
char *str = NULL;
str = GetString(); // str 的内容是垃圾
cout<< str << endl;
}

1。怎么才能正确返回?在函数中用new或malloc可以吗?
还有其他什么好方法吗? 先谢谢了

2。还想问一个问题,就是:是不是只有用malloc或new申请的内存是动态内存?
函数内的定义的变量(不用malloc或new)在栈上创建,跳出函数就自动释放的?
...全文
322 44 打赏 收藏 转发到动态 举报
写回复
用AI写文章
44 条回复
切换为时间正序
请发表友善的回复…
发表回复
guywei 2002-12-24
  • 打赏
  • 举报
回复
大家说得很详细了,

函数内的char p[] = "hello world";是一个局部变量,它的生命期开始于定义时结束于函数结束

局部变量在栈中分配,函数调用后会释放,再返回它的话将是内存垃圾。

JoshuaLi 2002-12-24
  • 打赏
  • 举报
回复
在函数中定义一个对象有两种方法:
2、在堆中分配。返回时不会摧毁,因为堆是全局存在的。但函数的调用者要记得delete回来的指针,不过很遗憾,人不是机器,总是要粗心大意的,往往忘记了释放,造成内存漏洞,不过比之1条的问题,还是要轻一些。

This is a guaranteed memory leak
---Scoot D. Meyers

在函数之外你如何delete无名内存?
JoshuaLi 2002-12-24
  • 打赏
  • 举报
回复
up
aqaqaq911 2002-11-14
  • 打赏
  • 举报
回复
const char * GetString(void)
{
const char * p = "hello world"; //const可不加,因为p已是const;
//如:p[0]='n';就是错的!
return p; //ok!
// return "hello world"; //ok!字符串是静态分配的!
// char ap[]="hello world";
// ap[0]='n'; //ok
// return ap; //错!返回局部变量!
}

不知这样的回答够不够清楚?
winne_ll 2002-11-14
  • 打赏
  • 举报
回复
你没有分配内存
痞子酷 2002-11-14
  • 打赏
  • 举报
回复
char *GetString(void)
{
char *p = "hello world"; //自动分配const空间
return p; // 编译器将提出警告
}
int main(void)
{
char *str = NULL;
str = GetString(); // str 的内容是垃圾
printf("%s\n",str)
}
运行正确。
etu5 2002-11-13
  • 打赏
  • 举报
回复
char *GetString(void)
{
char p[] = "hello world";
return p; // 编译器将提出警告
}

改成:

char &GetString(void)
{
char p[] = "hello world";
return p; // 编译器将提出警告
}

将不会出现问题!
因为,引用返回是不会创建临时变量的,返回的直接就是P的地址
而函数结束后自动购销P变量但是P指向的地址单元的数值没有改变,就是说P地址的“Hello World”的值还是存在的,这就是为什么引用返回可以得到正确的值而指针返回得不到(指针返回是要临时创建一个临时指针变量,这个时候P已经被购销了,没有指向那块地址了,所以,返回的值是垃圾)
alafeng 2002-11-13
  • 打赏
  • 举报
回复
回复人: wwwwbb78() ( ) 信誉:100 2002-11-13 11:09:57 得分:0

string GetString(void)
{
char p[] = "hello world";

char *p2 = new char[12];
strcpy(p2,p1);
p2[11]='\0';
return p2;
}
void Test4(void)
{
string str;
str = GetString();
cout<< str.c_str() << endl;
}
//局部变量不可返回
//但是可以返回动态变量


你光NEW了,没有DELETE呢, 内存会泄漏的

cxwhust 2002-11-13
  • 打赏
  • 举报
回复
实际上,不是所有的编译器都是一样的,一般来说
ufwt(uuu) 和 florist2000(我爱susan) 的 代码有效,即
char *GetString(void)
{
char *p = "hello world";
return p;
}
但下面代码有安全问题
char *GetString(void)
{
char p【】 = "hello world";
return p;
}

why?(florist2000(我爱susan) 的说法很好)
因为字符串常量存储再静态存储区域.
所以一直都存在,p是临时变量,但过程结束并不会释放这个字符串常量.

而p【】就不一样了,它是一个数组,数组里面存放了字符串,这个字符串没有放在字符串常量存储再静态存储区域;
p是临时变量,跳出函数之后一般保留一步就释放了,数组的空间回收了,字符串没有了,你的程序在下一步还在使用,内存已经释放了,这个指针也就失效了。


lhynew 2002-11-13
  • 打赏
  • 举报
回复

char *GetString(void)
{
char p[] = "hello world";
return p; //p在这为临时变量,函数返回时释放,因此产生告警
//如果使用该函数的返回值,则程序可能会报错甚至退出(非法地址)
}
改为
char* GetString(void)
{
static char p[]="hello world";
return p; //p为静态创建,程序退出时才释放
}

1。怎么才能正确返回?在函数中用new或malloc可以吗?
new一般用在C++,malloc则一般在c中使用。在c++中,new功能很强,可以替换malloc,但malloc不能替换new的所有功能。如new时会调用构造函数,malloc
仅分配空间,不负责初始化。
用new和malloc时应注意释放空间,分别对应的释放函数为:delete和free。不要
对调。使用delete时,会调用类的析构函数,而free则不会。
从你的问题看出,你是c和c++的初学则,多看看c++的书吧!
wwwwbb78 2002-11-13
  • 打赏
  • 举报
回复
string GetString(void)
{
char p[] = "hello world";

char *p2 = new char[12];
strcpy(p2,p1);
p2[11]='\0';
return p2;
}
void Test4(void)
{
string str;
str = GetString();
cout<< str.c_str() << endl;
}
//局部变量不可返回
//但是可以返回动态变量
srm2000 2002-11-13
  • 打赏
  • 举报
回复
char *GetString(void)
{
char p[] = "hello world";
return p; // 编译器将提出警告
}
返回的是局部变量的地址,不允许。用引用
qingtingying 2002-11-13
  • 打赏
  • 举报
回复
用引用还是一样的不行呢。
flyooh 2002-11-13
  • 打赏
  • 举报
回复
用string可是P还是临时变量呀,怎么就行了????????
string GetString(void)
{
char p[] = "hello world";
return p;
}
void Test4(void)
{
string str;
str = GetString();
cout<< str.c_str() << endl;
}

// 这个地方编译器做了手脚,还原看看
void GetString(string& __result)
{
char p[] = "hello world";
// 这里调用了构造函数哦
__result.string::string(p);
return;
}

int main()
{
string str;
str.string::string();

// 这里没有调用构造函数
string _temp;
GetString(_temp);
// 此时_temp还没有析构哦
str.operator=(_temp);
// 所以带回来了返回值
_temp.string::~string();

....
return 0;
}
predawning 2002-11-11
  • 打赏
  • 举报
回复
用string可是P还是临时变量呀,怎么就行了????????
string GetString(void)
{
char p[] = "hello world";
return p;
}
void Test4(void)
{
string str;
str = GetString();
cout<< str.c_str() << endl;
}



用string 实现,是值拷贝!不存在释放内存会影响拷贝的问题。
cutcutcutcut 2002-11-11
  • 打赏
  • 举报
回复
好好看书,弄清楚变量的生存期,看看我的吧:
char *GetString(void)
{
static char p[] = "hello world";
return p;
}

没警告了!!!

kxw 2002-10-30
  • 打赏
  • 举报
回复
不要返回局部变量,当生命期结束时会自动析构。
也不要用new,因为不知道在什么时候抛出异常,而根本没有调用它的delete
总之,在函数中不要返回以上两种情况的指针。
mfs 2002-10-30
  • 打赏
  • 举报
回复
用string可是P还是临时变量呀,怎么就行了????????
string GetString(void)
{
char p[] = "hello world";
return p;
}
void Test4(void)
{
string str;
str = GetString();
cout<< str.c_str() << endl;
}
程序的色彩 2002-10-30
  • 打赏
  • 举报
回复
const char *GetString(void)
{
const char *p = "hello world";
return p;
}

florist2000 2002-10-30
  • 打赏
  • 举报
回复
char *GetString(void)
{
char *p = "hello world";
return p;
}


这痒是可以的,因为字符串常量存储再静态存储区域.
所以一直都存在,p是临时变量,但过程结束并不会释放这个字符串常量.

加载更多回复(24)

64,671

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧