首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

用函数返回值回传递动态内存

2013-08-09 
用函数返回值来传递动态内存在程序调试中发现str GetString()语句执行完后监视中显示str的值为“hello w

用函数返回值来传递动态内存
用函数返回值回传递动态内存

在程序调试中发现str = GetString();语句执行完后监视中显示str的值为“hello world”,最后输出的确实是垃圾(不是“hello world”),想知道为什么调试中会出现这种情况?求指导 动态内存
[解决办法]
在执行

std::cout << str << std::endl;
后,栈上的内容被修改,在这句前后watch一下。 

修改办法: 

char const* getString()
{
  return "hello world";
}

[解决办法]
引用:
Quote: 引用:

Quote: 引用:

GetString();函数里定义的char p[]数组是在函数堆栈上分配局部变量,函数返回之后局部变量内存就被释放了。


char p[] ;// 返回是局部指针, 在函数调用结束后,会回收这片内存空间的,

换成:


char * GetString()
{
    char *p = (char*)mallco(32) ;//分配在堆中,自己管理,程序没结束,
                  //,没有手动释放,就一直存在
    memcpy(p, "Hello world", 32);
    return p;
}


按理说,那个调用执行完后,str的值应该显示某些奇怪的东西才对,这种显示和值是怎么回事


这是因为你的工程小,系统回收,只是说明那个内存空间是可以再利用的,不是真正就没有了那片空间的,当有很大的工程的时候,栈空间不够的时候,你这个数据是得不到正确的,

[解决办法]
char p[]="hello world";这个字符串在GetString调用完后被释放调用了、、之所以str可以显示出来是因为str指向的内存空间内容还是"hello world",当cout<<str<<endl;执行时里面涉及到的函数调用将堆栈破坏了,str所指向的内容不再是"hello world",,所以打印出来乱码了

热点排行