Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何用C语言初始化具有内存地址的字符数组?_C_Arrays_Memory_Memory Address - Fatal编程技术网

如何用C语言初始化具有内存地址的字符数组?

如何用C语言初始化具有内存地址的字符数组?,c,arrays,memory,memory-address,C,Arrays,Memory,Memory Address,我在一个大二的C班,这个项目是关于处理指针和设计内存转储函数。因此,我能够通过指针进行斗争,得到一个要转储的起始地址和结束地址,甚至对其进行位屏蔽,我想用起始内存地址初始化一个char数组。我用存储屏蔽起始地址的同一变量初始化它,但当我打印数组时,它包含不同的内存地址。下面是函数: void memDump(void *base, int bytes) { unsigned char *begin; begin = base;//beginning of range of memory unsi

我在一个大二的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);
    }

}
void memDump(void*base,int字节)
{
无符号字符*开始;
begin=base;//内存范围的开始
unsigned char*end;//结束内存范围
结束=基+字节;
INTA,b;
长整型d=基本型;
d=d&0xFFFFF0;//正在尝试位掩码
long int e=结束;
e=e&0xFFFF0;//屏蔽了开始和结束范围
char c[16]={d};//循环变量
printf(“%x”,c);
对于(a=begin;a您不能用某些“内存地址”来“初始化字符数组”。字符数组只能用字符初始化

Stackoverflow不是为你做家庭作业,所以我会给你一些建议,然后你可以尝试实现它。如果你不能将建议转化为代码,那么你就不值得交一份已完成的作业

首先,一旦您对“d”进行了位屏蔽,您需要将其存储回“begin”中,这样您就有了一个指针,可以开始读取要转储的字节

本说明:

printf( "%08p ", begin );
printf( "%02x ", *(begin++) );
将以8个字符的形式呈现“开始”地址的十六进制表示形式,后跟一个空格。这是您需要如何开始内存转储的每一行

指示:

printf( "%08p ", begin );
printf( "%02x ", *(begin++) );
获取由“begin”指向的字节,并将该字节的十六进制表示形式呈现为两个字符,后跟一个空格。然后递增“begin”以指向下一个字节。根据内存转储的宽度,需要执行8或16次此操作,然后执行
printf(“\n”)
以移动到下一行

然后,您需要不断重复上述操作,直到“开始”超过“结束”。(因此,您正在查看每行的外部循环,以及每行中的每个字节的内部循环。)


我希望这能有所帮助。

正如@Jean Françoisfar观察到的那样

可能不会执行您认为它执行的操作。也就是说,除非您认为它执行的操作是将存储在
d
中的
long-long int
值转换为type
char
(生成从比
d
本身小得多的范围中提取的实现定义结果),使用该值初始化数组
c
的第一个元素,并使用
0
初始化其他十五个元素。我无法想象您希望对结果做什么,但由于您实际上没有对其做任何操作,这可能是没有意义的

正如我自己观察的那样

也可能不做您认为它做的事情。事实上,您不能依赖它来做任何特定的事情,因为它的行为是未定义的。您正在传递一个指向
c
的第一个元素的指针作为第二个参数,但是需要一个类型为
unsigned int
的值(基于格式)。在任何情况下,这既不会“打印数组”,也不会告诉您它包含的内容

我猜想您实际上想到的是将
c
声明为一个数组,其地址(而不是内容)是由
base
指定的,被截断为16字节对齐的地址。您不能这样做,因为您不能指定您声明的任何变量的地址,但您可以将
c
声明为指针,如是:

unsigned char *c = d;
(哦,不,还有更多的指针!)这里有一些实现依赖性,但它可能有我认为您想要的结果。或者,如果您想变得非常聪明,您可以这样做:

unsigned char (*c16)[16] = d;
它将
c16
声明为指向16个
无符号字符的数组的指针。您可以在指定的地址声明数组。但是,我怀疑您会发现使用其他声明更容易

如果您想打印指针指向的内存内容(就像“内存转储”函数似乎不常用的那样),那么您需要做更多的工作。标准库的格式化I/O函数不直接提供用于打印数组的功能(有充分的理由,我在这里不赘述)除了C字符串之外,您似乎不想将数据打印为C字符串。但是,请考虑这个调用,以及如何修改它或使之适应您的目的(假设我上面的声明为<代码>代码>代码>):


你期望什么,什么让你不高兴?请注意,在
char
中存储指针值可能做任何事情,但不是你想要的(
char c[16]={d};
)。你想将
d
内容作为字节复制到数组中吗?这里的一些人对c非常熟悉,所以“指针垃圾”可能有问题。有两个问题(这不应影响您尝试执行的操作,但无论如何这是错误的):您不应将指针分配给普通整数变量。如果您需要一个保证适合指针的整数,则应使用。此外,如果您希望使用格式
“%p”
打印
void*
(强制转换到
void*
需要没有未定义的行为)。我不容易被冒犯,但我确实觉得“指针垃圾”有点令人恼火。@EugeneSh:哦,这不是问题,考虑到这个术语是用在一些垃圾代码的问题中;-)是的,谢谢。我不是想帮我完成家庭作业,只是想了解一些情况。在我发布这篇文章之后,我做了我应该先做的事情,并阅读了网站的其余部分,关于如何调试小程序、指南和其他内容的页面。再次感谢。很好,很高兴能提供帮助,Damian。正如你可能自己发现的,stackoverflow是这是全世界程序员不可或缺的资源。
printf("%02x", *c);