我对这些事实可能是错的,所以纠正我!
指针指向一个内存地址,如果你去了这个内存地址你会找到一个字节?指针也指向它指向的内存段的最低地址,所以如果它指向一个8字节的内存段,从0x0开始到0x7结束,它将指向0x0?
指针如何知道它指向的内存大小?因此,如果一个指针指向一个128字节大小的内存段并且指针被转换为另一种类型,那么内存段的大小会发生什么变化呢?
答案 0 :(得分:8)
指针如何知道它指向的内存大小?
它没有。
因此,如果一个指针指向一个128字节大小的内存段并且指针被转换为另一种类型,那么内存段的大小会发生什么变化呢?
记忆仍在那里,但是既然你丢弃了关于那里的物体的唯一信息,那么,你知道。就是这样。你不知道。
这就是为什么人们在通过sizeof
对对象进行别名化以获取基础字节时使用char*
的原因:
std::ofstream os("some-binary-file");
const double d = 0.1234;
os.write((char*)&d, sizeof(double));
// ^^^^^^^^^^^^^^
//
// Otherwise os.write has no way of knowing how much to write
当然,如果你要在double*
附近徘徊,那么使用该指针的每一段代码都会假设它指向一个或多个"块"内存精确sizeof(double)
字节宽。如果它没有,那那就是你的错。
tl; dr:告诉程序它必须使用多少个指针字节是你的责任。
答案 1 :(得分:2)
指针如何知道它指向的内存大小?
每个指针(除了void *
)都有一个关联的类型。该类型告诉编译器在指向的位置预期有多少字节。取消引用指针时,编译器会发出机器指令,读取该位置的相应字节数。
因此,sleep
指针无法解除引用,因为它们不会携带有关指向数据大小的编译时信息。