如何显示堆上创建的内存地址?

时间:2017-11-23 16:37:05

标签: c++

我知道这是一个非常基本的问题,但我说得不对。

header( 'Content-Type: text/html; charset=utf-8' );

这里我创建了一个指向char,data的指针。数据是一个指针,它将char数组的地址存储在堆上。

当我char * data = new char[5]; data = "hamz";

为什么不向我显示地址?它向我展示了“汉兹”。

与此相同

cout<<data;

我怎么知道存储在数据中的地址?因为它将数组的地址存储在堆上。

3 个答案:

答案 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"