如何使用C中的内存地址初始化char数组?

时间:2016-09-29 19:12:56

标签: c arrays memory memory-address

我在大二C课程中,这个项目是关于处理指针和设计内存转储功能。所以我已经能够通过指针挣扎并得到一个开始和结束地址来转储,甚至用bitmasked它,我想用起始内存地址初始化一个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的文章和一些关于如何调试的文章帮助了我。

2 个答案:

答案 0 :(得分:1)

你不能&#34;初始化一个char数组&#34;有一些&#34;内存地址。&#34; char数组只能用字符初始化。

Stackoverflow不是为你做功课,所以我会给你一些建议,然后你可以尝试实现它。如果您不能将建议放入代码中,那么您就不应该完成任务。

首先,一旦你对你的&#34; d&#34;进行了比特掩码,你需要将它存储回&#34;开始&#34;,这样你就有了一个指针可以从中开始读取字节转储。

这条指令:

printf( "%08p ", begin );

将呈现您的&#34;开始&#34;的十六进制表示。地址以8个字符开头,后跟一个空格。这就是你需要开始内存转储的每一行的方法。

指示:

printf( "%02x ", *(begin++) );

获取&#34; begin&#34;指向的字节,并以两个字符呈现该字节的十六进制表示,后跟一个空格。然后它会递增&#34;开始&#34;,指向下一个字节。您需要执行此操作8或16次,具体取决于您希望内存转储的宽度,然后执行printf( "\n" )移动到下一行。

然后你需要不断重复上述内容,直到你开始&#34;开始&#34;已超过你的&#34;结束&#34;。 (因此,您正在查看每个行的外部循环,以及行内每个字节的内部循环。)

我希望这会有所帮助。

答案 1 :(得分:0)

@ Jean-FrançoisFabre观察,

char c[16]={d};

可能不会做你认为它做的事情。也就是说,除非您认为它的作用是将long long int中存储的d值转换为char类型(生成一个实现定义的结果,其范围远小于{{} 1}}本身),用该值初始化数组d的第一个元素,并用c初始化另外十五个元素。我无法想象你想对结果做什么,但是因为你实际上没有做任何事情,这可能没什么问题。

正如我自己观察的那样,

0

也可能不会做你认为它做的事情。实际上,你不能依赖它来做任何特定的事情,因为它的行为是未定义的。您正在将指针作为第二个参数传递给printf("%x", c); 的第一个元素,但是将改为使用类型c的值(基于格式)。在任何情况下,这既不“打印[s]数组”也不会告诉你任何关于包含的内容。

我怀疑你实际想到的是将unsigned int声明为一个数组,其地址 - 而不是内容 - 由c指定,被截断为一个16字节对齐的地址。你不能这样做,因为你不能指定你声明的任何变量的地址,但你可以将base声明为指针,如下所示:

c

(哦,不,更多指针!)那里有一些实现依赖,但它可能有我认为你想要的结果。或者,如果你想变得非常聪明,你可以这样做:

unsigned char *c = d;

unsigned char (*c16)[16] = d; 声明为指向16 c16数组的指针。它就像在你指定的地址处声明一个数组一样接近。不过,我怀疑你会发现使用其他声明会更容易。

如果你想打印这样一个指针指向的内存的内容(作为“内存转储”函数似乎不会这样做),那么你需要做更多的工作。标准库的格式化I / O函数不直接提供打印数组(除非C字符串,否则我不会在这里提到),并且您似乎不希望将数据打印为C字符串。但是,请考虑此调用,以及如何修改它或使其适应您的目的(假设我的上述unsigned char声明):

c