我知道这是一个非常基本的问题,但我说得不对。
header( 'Content-Type: text/html; charset=utf-8' );
这里我创建了一个指向char,data的指针。数据是一个指针,它将char数组的地址存储在堆上。
当我char * data = new char[5];
data = "hamz";
为什么不向我显示地址?它向我展示了“汉兹”。
与此相同
cout<<data;
我怎么知道存储在数据中的地址?因为它将数组的地址存储在堆上。
答案 0 :(得分:3)
ostream
<<
的{{1}}重载以特殊方式工作:它将内存作为字符输出到下一个NUL终止符。
如果要关闭此行为并输出指针的实际地址,请转换为const char*
:
const void*
请注意,您应该写
std::cout << (const void*)(data);
并将const char* data = "hamz";
分开。目前你泄漏的内存就像漏勺漏水一样。
答案 1 :(得分:1)
您可以使用std::cout
的成员函数调用语法输出data
指针值而不是字符串文字:
std::cout.operator<<(data);
这将调用接受const void*
类型参数的第7个std::basic_ostream::operator<<重载。首选std::string到原始字符数组。
答案 2 :(得分:0)
首先,只是为了回答您的问题,您需要将char*
- 类型转换为void*
,即写cout << (void*)data;
。否则,当数据类型为char*
时,cout
会将data
视为'\0'
- 已终止的字符序列。
然而,还有其他问题: 声明
data = "hamz";
让data
指向字符串文字,但它不会将字符串"hamz"
复制到堆上分配的内存中。您实际上松开了指向堆中已分配内存的指针并产生内存泄漏。要复制内容,您必须使用strcpy(data,"hamz")
。
然后,当data
指向(按定义)不可变字符串文字时,数据类型应为const char*
,即const char* myData = "hamz"
。