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

C++ 尝试读取sizeof()返回意外结果,c++,pointers,memory,memory-management,heap-memory,C++,Pointers,Memory,Memory Management,Heap Memory,这是我的密码。正如你所能告诉我的,我是C++初学者,尤其是指针。我在实践中学习,这就是为什么我有那些Log()输出,只是帮助我看看我是否做的每件事都是正确的。我遇到了一个读取变量/数据类型大小的函数,这让我有点困惑 如果我故意将堆上的8字节内存分配给变量'buffer',为什么sizeof()会将'buffer'读取为4字节?我在这里遗漏了什么/做错了什么/不理解什么 #include <iostream> #define Log(message) std::cout <&l

这是我的密码。正如你所能告诉我的,我是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");
}
#包括
#定义日志(消息)std::cout
sizeof(x)
告诉您
x
的大小,而不是
x
指向的任何对象的大小

另一个不相关的注意事项是,
x
没有装载到
std::string
,因此强制转换是错误的


建议:忘记
new[]
,只需使用
std::string buffer
。它将为您管理
new[]
delete[]
,也可以在您复制它时添加字符等。

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


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

sizeof(buffer)
char*
的大小
sizeof
不知道动态分配的内存,它的纯编译时间使用
char buffer[8]应该会得到不同的结果小心。你写C++就像它是C。这是你必须学会写“适当”的C++,越快越好。Rerito
sizeof
将在C中产生相同的结果,而在C中强制转换将是错误的too@largest_prime_is_463035818我很清楚这一点,我想我的评论仍然是正确的。我只将*缓冲区转换为字符串,因为如果我不这样做,控制台中的输出看起来很奇怪。你有什么建议?如何在不强制转换的情况下正确打印出相应的值?您只需将
缓冲区的第一个字符初始化为(在ASCII系统上)换行字符。当您正在读取未初始化的数据时,尝试打印具有未定义行为的数据。我建议从开始使用
std::string
,我已经将char*buffer=new char[8]更改为std::string*buffer[8]并删除了强制转换,它仍然像以前一样打印出来,所以谢谢你!现在我的问题是。。。为什么sizeof()现在读取32?不,
std::string buffer(8)您声明了8个指向字符串的指针,然后将这些指针的值设置为任意数。别瞎猜了。C++不是一个安全的语言来猜测我的歉意。我只是一个试图学习的初学者。你能澄清一下你的意思吗?另外,std::string buffer(8)返回一个错误。。。猜是因为我给一个字符串分配了一个int?我按照你的建议删除了new,并将其初始化为string*而不是char=new char[]。如何使sizeof()读取缓冲区指向的大小?我尝试添加*但它没有改变任何东西。@ImMalkah:
字符串*
?我故意写了
string
——那不是指针。接下来,阅读教科书中关于
std::string
的章节。它有一个
.size()
成员函数。我知道。。。我目前正在使用非常简单的指针,我只是想理解为什么sizeof()不返回8字节。你告诉我这是因为它没有读取缓冲区所指向的大小,我很感激,现在我该如何以正确的方式进行操作,以便sizeof()将缓冲区读取为8个是?你不能。那个信息不见了。这就是为什么我们建议不要使用pointers@ImMalkah:如果查看
sizeof(std::string)
,您会注意到它大于
sizeof(char*)
。原因之一是,即使是
std::string
也无法从单个
char*
计算
std::string::size