【发布时间】:2016-09-29 19:12:56
【问题描述】:
我在上二年级的 C 班,这个项目是关于处理指针和设计内存转储函数的。所以我已经能够通过指针挣扎并获得一个开始和结束地址来转储,甚至对其进行位掩码,我想用开始内存地址初始化一个 char 数组。我用存储我屏蔽的起始地址的相同变量初始化它,但是当我打印数组时,它包含不同的内存地址。函数如下:
void memDump(void *base, int bytes)
{
unsigned char *begin;
begin = base;//beginning of range of memory
unsigned char *end;// ending range of memory
end = base + bytes;
int a, b;
long long int d=base;
d=d&0xFFFFF0; //trying to bitmask
long long int e=end;
e = e&0xFFFF0; //masked off the beginning and ending range
char c[16]={d}; //loop variables
printf("%x", c);
for (a=begin; a<=end; a+=16)
{
printf("\n%016X\n", d);
printf("%016X\n", a);
printf("%016X", e);
}
}
对不起,伙计们,我找不到类似的东西,这是我最后的选择。谢谢!
更新:感谢大家的洞察力,阅读更多关于 C 的内容和一些关于如何调试的文章帮助了我。
【问题讨论】:
-
您期待什么,什么不让您满意?请注意,将指针值存储在
char中可能会做任何事情,但不是您想要的 (char c[16]={d};)。是否要将d内容作为字节复制到数组中? -
这里有些人对C很亲近,所以“指针垃圾”可能会冒犯。
-
两个问题(这不应该影响您尝试做的事情,但无论如何这是错误的):您不应该将指针分配给普通整数变量。如果您需要一个保证适合指针的整数,您应该使用
intptr_tfrom<stdint.h>。此外,如果您想使用printf打印指针,请使用"%p"格式来打印void *(需要转换为void *才能没有未定义的行为)。 -
我并不容易被冒犯,但我确实觉得“指针垃圾”有点烦人。
-
@EugeneSh.: 哦,这不是问题,考虑到该术语用于带有一些垃圾代码的问题;-)
标签: c arrays memory memory-address