我正在研究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
答案 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;
}