微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

尝试读取 sizeof() 返回意外结果

如何解决尝试读取 sizeof() 返回意外结果

这是我的代码。您可能会说,我是 C++ 的完全初学者,尤其是指针。我边做边学,这就是为什么我有那些 Log() 输出,只是帮助我看看我是否做对了一切。我遇到了一个读取变量/数据类型大小的函数,这让我有点困惑。

如果我故意在堆上分配 8 个字节的内存给变量 'buffer',为什么 sizeof() 将 'buffer' 读为 4 个字节?我在这里遗漏了什么/做错了什么/不理解?

#include <iostream>

#define Log(message) std::cout << message << std::endl;

int main()
{
char* buffer = new char[8];
Log(sizeof(buffer));

for (int i = 0; i < 8; i++)
{
    *buffer = 10;
    Log("Buffer is a variable that takes up 8 bytes of memory and is located on the heap. It holds 
    the value " << ((std::string*)*buffer) << " located at the memory address " << 
    ((std::string*)&buffer));
}

system("pause");
}

解决方法

sizeof(x) 告诉您 x 的大小,而不是 x 指向的任何大小。

在一个不相关的注释中,x 没有挂载到 std::string,因此转换是错误的。

建议:忘记new[],使用std::string buffer。它会为您管理 new[]delete[],在您复制、添加字符等时也是如此。

,

buffer 是一个指针对象。它指向 char[8] 对象(没有名称)的第一个元素,但它本身是一个 char *。在您的平台上,所有指针都占用 4 个字节。在其他常见平台上,所有指针都占用8个字节。

请注意,您的程序具有未定义的行为,因为您将 *buffer 重新解释为 std::string*charstd::string* 完全无关。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。