【问题标题】:Memory Locations of Vectors not Continuous向量的内存位置不连续
【发布时间】:2020-09-26 04:14:41
【问题描述】:

我在 Kubuntu 20.04 上使用 C++ 并运行以下代码:

   vector<int> v(10,2);
   cout<<sizeof(int)<<"\n";
   for (int i = 0; i < 10; ++i)
      cout<<&(v[i])<<"\n";

输出是:

4
0x55967f666f10
0x55967f666f14
0x55967f666f18
0x55967f666f1c
0x55967f666f20
0x55967f666f24
0x55967f666f28
0x55967f666f2c
0x55967f666f30
0x55967f666f34

如果向量在内存中顺序存储数据(如上面4字节的块大小),那么为什么在“0x55967f666f18”之后是“0x55967f666f1c”而不是“0x55967f666f22” ”?

【问题讨论】:

  • 你知道十六进制数是如何工作的吗?例如,9 之后会发生什么?
  • 因为0x55967f666f18 0x55967f666f1c 0x55967f666f22?更简单(忽略前导数字)0x1c 0x22 -- 即使你不知道十六进制,这似乎不是从1 &lt; 2 开始的吗? (顺便说一句,如果您不知道十六进制,最好问一下为什么c 显示为数字,因为这似乎比按顺序排列数字更基本。)
  • (0x55967f666f1c - 0x55967f666f18) == 4 == sizeof(int) (on your machine)
  • 哦……我明白了……我对十六进制不太熟悉……谢谢@cegien 的回答

标签: c++ vector memory-management stl c++17


【解决方案1】:

您正在考虑十进制(以 10 为基数)数字系统,但指针以十六进制系统(以 16 为基数)打印。十六进制是计算中非常重要的系统。

在十六进制中,您有数字:

0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F

地址正确且连续。如果您想在 Base 10 中查看它们,请使用如下转换器:https://www.binaryhexconverter.com/hex-to-decimal-converter

十进制的两个地址是:

94104870874904
94104870874908

【讨论】:

    猜你喜欢
    • 2012-08-09
    • 2021-10-20
    • 2019-01-12
    • 2014-09-26
    • 2012-02-29
    • 2018-01-03
    • 2011-10-20
    • 1970-01-01
    • 2011-04-27
    相关资源
    最近更新 更多