【发布时间】:2014-11-23 04:02:04
【问题描述】:
void *memory;
unsigned int b=65535; //1111 1111 1111 1111 in binary
int i=0;
memory= &b;
for(i=0;i<100;i++){
printf("%d, %d, d\n", (char*)memory+i, *((unsigned int * )((char *) memory + i)));
}
我试图理解一件事。
(char*)memory+i - 打印出 2686636 - 2686735 范围内的地址。
当我使用 memory= &b 存储 65535 时,这应该将此数字存储在地址 2686636 和 2686637 因为每个地址只有一个字节所以 8 个二进制字符所以当我打印出来时
*((unsigned int * )((char *) memory + i)) 这应该打印 2686636, 255 和 2686637, 255
而不是它打印 2686636、65535 和 2686637,随机数
我正在尝试实现内存分配。是学校项目。这应该代表内存。一个地址应该是一个字节,因此标头将是 2686636-2586639(4 个字节表示块大小)和 2586640(1 个字节字符表示空闲或已用内存标志)。谁能给我解释一下谢谢。
感谢您的回答。
void *memory;
void *abc;
abc=memory;
for(i=0;i<100;i++){
*(int*)abc=0;
abc++;
}
*(int*)memory=16777215;
for(i=0;i<100;i++){
printf("%p, %c, %d\n", (char*)memory+i, *((char *)memory +i), *((char *)memory +i));
}
输出是
0028FF94, , -1
0028FF95, , -1
0028FF96, , -1
0028FF97, , 0
0028FF98, , 0
0028FF99, , 0
0028FF9A, , 0
0028FF9B, , 0
我认为它有效。 255 只有一个 -1、65535 2 次 -1 和 16777215 3 次 -1。
【问题讨论】:
-
只删除 unsigned int 吗?现在的输出是 2686636, -1 和 2686637, -1
-
我这样做 printf("%p, %c, %d\n", (char*)memory+i, *((char *) memory + i), *((char * ) 记忆 + i));它给出了 2686636, ,-1 但我注意到当我使 b = 65535 前 2 个地址是空格时,-1 但是当我使 b = 4294967295 前 4 个地址是空格时,-1 和 4294967295 是 32 位所以我认为它以某种方式工作。
-
我更改了代码,我认为它现在可以正常工作,请检查我最后发布的问题
-
我很惊讶第二部分有效!
-
为什么?我试过这个 (char)memory='a';而不是某个数字,输出为 0028FF94、a、97,所有其他内存单元为 0。所以我认为没关系,它的工作原理应该是这样。