指针内存使用情况

时间:2015-07-08 11:59:35

标签: c++ pointers memory

我对这些事实可能是错的,所以纠正我!

指针指向一个内存地址,如果你去了这个内存地址你会找到一个字节?指针也指向它指向的内存段的最低地址,所以如果它指向一个8字节的内存段,从0x0开始到0x7结束,它将指向0x0?

指针如何知道它指向的内存大小?因此,如果一个指针指向一个128字节大小的内存段并且指针被转换为另一种类型,那么内存段的大小会发生什么变化呢?

2 个答案:

答案 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指针无法解除引用,因为它们不会携带有关指向数据大小的编译时信息。