char * getStr0()
{
char arrStr[] = "abcd";
return arrStr;
}
char * getStr1()
{
char *arrStr = "abcd";
return arrStr;
}int main(int argc, char* argv[])
{
//printf("Hello World!\n");
char *p;
p = getStr0();
printf(p); p = getStr1();
printf(p); system("PAUSE");
return 0;
}
输出为"abcd"即一个乱码加正确的输出abcd,想问一下为什么,内存中是怎样做的,心里不清楚.
解决方案 »
- 用MOXA串口卡设置RS422标准接收数据,收不到,高分求助!!!
- 给slider bar添加了两幅背景图片后,thumb走动时出现闪烁现象
- 有其它语言开发数据库系统经验,怎么样才能最快学会MFC数据库开发呢?
- 请问如何用全局钩子钩本地所有进程的createprocess()和exitprocess?
- 蔡鸟求救!!从装系统后,安装visual studio6.0,所有的文件都不能编译,
- 请kuibobo(大雨清澎) fzd999(花差花差)两位进来拿分!
- dll初级问题--exp,lib
- 如何在VC/MFC工程里用CWebBrowser读取网页搜索框里的内容?
- 为什么老是喜欢把我的帖子往别的地方扔呀
- 怎样才能在vc的对话框中实现超连接?
- 一个非模式对话框 怎样在它失去焦点的时候销毁它
- 弹出子窗口后不能点击父窗口要怎么实现,就像一般程序的关于窗口
{
char arrStr[] = "abcd";//"abcd"在常量区,内容一般不会被改。拷贝到栈中
return arrStr;//返回栈中的指针
}
char * getStr1()
{
char *arrStr = "abcd";
return arrStr;//返回常量区中的指针,相当于传递"abcd"的地址
}int main(int argc, char* argv[])
{
//printf("Hello World!\n");
char *p;
p = getStr0();//函数结束后,其申请的栈内存里的数据不确定
printf(p);//输出不确定 p = getStr1();//执行后,p指向常量区"abcd"的地址
printf(p);输出"abcd" system("PAUSE");
return 0;
}
char *arrStr = "abcd";得到的是字符串常量的内存地址,因为字符串常量的内存不会被释放和修改,所以printf输出的是abcd。
char arrStr[] = "abcd";是在运行时把字符数组arrStr初始化为"abcd",因为是局部动态数组,其内存是在栈中动态分配的,函数返回后就自动释放了。这里的“释放”是指该内存不再由arrStr所占据,可以将其用于其它地方。释放后的内存中的数据是未知的,有可能保持释放前的数据,也有可能改变。