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

求教:这段代码为什么会有这样的输出结果?解决方法

2012-03-15 
求教:这段代码为什么会有这样的输出结果?#includestdio.hchar *GetMemory(void){charp[] hello world

求教:这段代码为什么会有这样的输出结果?
#include"stdio.h"
char *GetMemory(void)
{
charp[]= "hello world";
return p;
}

void Test(void)
{
char*str;
str= GetMemory();
printf(str);
}

voidmain()
{
Test();
}

结果:
只有hell这四个字母,l后还有一个笑脸.

[解决办法]
你是用什么编译器的vc6.0吗?

我在vc7.0里面运行结果只有笑脸; 如果将GetMemory()函数改成下面这样:
char* GetMemory(void) 

//char p[]= "hello world"; 
char *p;
p = new char[strlen("hello world") + 1];
p = "hello world";
return p; 

输出就正确了, lz可以比较一下. 在这里虽然p也是局部变量, 里面存放的"Hello World"串的首地址. 同样在函数结束时候会自动析构掉, 但是函数结束后, 会有一个临时变量保存"Hello World"串的首地址, 将他赋给test()函数里面的str指针, test()里面输出的就是"Hello World";

原因就是: char p[]= "hello world"; p局部变量和"hello world"都存放在栈中, 函数结束都会析构调. 而new以后,"hello world" 存放在堆中, 全局性质, 函数结束后仍然存在.
此外
char * s = "Hello World1";
char t[] = "Hello World2";
s[2] = 'A';
t[2] = 'A';
这段代码, 在执行时会发现,s[2] = 'A'会发生错误; 因为数据“Hello World2”存在于数组中,所以,此数据存储于栈区,对它修改是没有任何问题的。因为指针变量s仅仅能够存储某个存储空间的地址,数据“Hello World1”为字符串常量,所以存储在静态存储区。虽然通过s[2]可以访问到静态存储区中的第三个数据单元,即字符‘l’所在的存储的单元。但是因为数据“Hello World1”为字符串常量,不可以改变,所以在程序运行时,会报告内存错误。

热点排行