关于char* 和char[] 又有些犯糊涂了 求助
#include<iostream>
using namespace std;
char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
cout<<str<<endl;
}
int main()
{
Test();
return 0;
}
请问为什么输出未知内容呢。 还有将p[]改为*p就能正常输出 小弟很是不解。。
[解决办法]
p[]是局部变量,是在栈中分配内存的,作用域结束后被销毁;
*p指的是常量字符串,在全局存储区存储,所以一直有值
[解决办法]
char p[] = "hello world";
这样使用的话"hello world"是存储在GetMemory函数的栈空间,P记录着"hello world"的首地址
当GetMemory函数退出时,"hello world"所使用的栈空间回溯,调用cout<<str<<endl;时那个被回溯的栈空间
内存中的数据,"hello world"就会被覆盖。
char *p= "hello world";
这样使用的话"hello world"会被编译到常量区,这个区域的数据不会被覆盖。
cout<<str<<endl;就可以正常输出了。
[解决办法]
这个要用**或*&
[解决办法]
这一篇博客很好!希望你能认真读完!加油!。。http://www.cnblogs.com/qiubole/articles/1094770.html
[解决办法]
这个问题其实就是对常量和变量的理解问题。
char sztemp[] = “...”; //这种方式其实声明了一个数组变量而已,内容已经初始化。
char* psztemp = "...";// 这种方式其实声明了一个指针,指向一个常量字符串的首地址,也就是说这个string是分配在全局常量内存区的
你可以再看看区分如下几个方式:
const char* psztemp = "";
char* const psztemp = "";
const char* const psztemp = "";
其实对这里的情况,声明为:
char* const psztemp = "";
更加合理些。