测试源码如下:
#include <iostream>
#include <string>
#include <cstdio>
#include <cstring>
using namespace std;
void myFunction(const char *p_ch)
{
string str("Function");
printf("函数里面,字符串为: %s\n", str.c_str());
p_ch = str.c_str();
}
int main()
{
const char * const_pcstr_t;
myFunction(const_pcstr_t);
printf("函数外面,字符串为: %s\n", const_pcstr_t);
{
string str("Block");
printf("块作用域里面,字符串为: %s\n", str.c_str());
const_pcstr_t = str.c_str();
}
printf("块作用域外面,字符串为: %s\n", const_pcstr_t);
char* pcstr_t = NULL;
try
{
pcstr_t = new char[10];
}
catch(bad_alloc)
{
cout<< "执行new 操作,分配空间失败."<< endl;
return 1;
}
strcpy(pcstr_t , "Heap");
printf("堆空间删除之前,字符串为: %s\n", pcstr_t);
delete [] pcstr_t;
printf("堆空间删除之后,字符串为: %s\n", pcstr_t);
int i_t = 0;//查看地址可以知道,字符串是存放在堆上,i_t存放在栈上
printf("堆中分配的地址:%x, string内部返回的地址:%x, 局部变量(栈上分配的)地址:%x\n",
reinterpret_cast<unsigned int>(pcstr_t),
reinterpret_cast<unsigned int>(const_pcstr_t),
reinterpret_cast<unsigned int>(&i_t)
);
return 0;
}
g++编译后程序输出如下:
函数里面,字符串为: Function
函数外面,字符串为: U��WVS�O
块作用域里面,字符串为: Block
块作用域外面,字符串为: Block
堆空间删除之前,字符串为: Heap
堆空间删除之后,字符串为:
堆中分配的地址:97c2040, string内部返回的地址:97c2034, 局部变量(栈上分配的)地址:bf9d4b8c