在整数分配的块中存储整数

时间:2018-11-20 22:39:07

标签: c

我正在研究Pintos第4部分,特别是inode数据结构的间接块。该块应该具有(512/4)= 128个整数,表示其中的其他磁盘扇区。我在这里的c程序中做了一个小模拟,将模拟扇区写入malloc的模拟扇区,然后将其读回。为什么钥匙这么大?为什么不是0、1、2、3、4。

#include <stdio.h>
#include <inttypes.h>
#include <stdlib.h>
#include <string.h>

int main(void) {

  void *mock_sector = malloc(512);
  for (uint32_t i = 0; i < 20; i++) {
    memset(mock_sector + i * sizeof(uint32_t), i, sizeof(uint32_t));
  }

  uint32_t key;
  for (uint32_t i = 0; i < 20; i++) {
    memcpy(&key, mock_sector + i * sizeof(uint32_t), sizeof(uint32_t));
    printf("Key is: %d\n", key);
  }

  return 0;
}

结果->

Key is: 0
Key is: 16843009
Key is: 33686018
Key is: 50529027
Key is: 67372036
Key is: 84215045
Key is: 101058054
Key is: 117901063
Key is: 134744072
Key is: 151587081
Key is: 168430090
Key is: 185273099
Key is: 202116108
Key is: 218959117
Key is: 235802126
Key is: 252645135
Key is: 269488144
Key is: 286331153
Key is: 303174162
Key is: 320017171

我什至可以看到我正在调用memset的地址正在按需增加。

0x18aa010 0x18aa014 0x18aa018 0x18aa01c 0x18aa020 0x18aa024 0x18aa028 0x18aa02c

2 个答案:

答案 0 :(得分:1)

手动执行指针算术,并使用memset / memcpy设置和获取值是很疯狂的。正确的方法:

((uint32_t *)mock_sector) [i] = i;

当然还有malloc(128 * sizeof(uint32_t)),而不是malloc(512)。

答案 1 :(得分:1)

如果我编译您的程序,但将printf中的格式说明符更改为%.8X(以16为底)而不是%d(以10为底),则输出为:

Key is: 00000000
Key is: 01010101
Key is: 02020202
Key is: 03030303
Key is: 04040404
Key is: 05050505
Key is: 06060606
Key is: 07070707
Key is: 08080808
Key is: 09090909
Key is: 0A0A0A0A
Key is: 0B0B0B0B
Key is: 0C0C0C0C
Key is: 0D0D0D0D
Key is: 0E0E0E0E
Key is: 0F0F0F0F
Key is: 10101010
Key is: 11111111
Key is: 12121212
Key is: 13131313

您现在看到模式和错误了吗?

memset的第二个参数强制转换为unsigned char(即字节),即使它的类型为int(如here所述)。这意味着每个单个字节(不是每个uint32_t)都将填充i的值,并强制转换为一个字节。

使用以下代码写入您的数组:

memset(mock_sector, 0, 512);

for (uint32_t i = 0; i < 20; i++) 
{
    mock_sector[i * sizeof(uint32_t)] = i;
}