对于将类型结构强制转换为固定大小数组中的某个内存位置,然后希望在用于结构的范围内访问特定的内存位置,我有点困惑。例如:
static char arraymemory[100];
struct header{
sruct header *previous, *successor;
int isfree;
int size;
};
struct header *headerptr;
headerptr= (struct header*)((char*)p + sizeof(struct header));其中p是类型为struct头的指针,指向数组的开头,而sizeof of ( struct头)是结构本身的字节计数加上成员。
因此,我进行了检查,而sizeof(struct头)是24个字节。现在我有了一个char数组,每个字符有一个字节,所以数组的100=size是1*。我获取位于数组开头的指针p,并将其移动24个字节(无论该内存位置是什么),这就是headerptr所指向的。如果我声明headerptr->isfree和headerptr ->大小等于某个值,同时让指针先前和后继保存一个内存位置,这是否意味着headerptr指向的位置最多可以在结构及其成员中使用24字节?
第二个问题,假设上面的答案是肯定的,如果我最终访问headerptr + 3的内存位置会发生什么?如果一个普通的char数据类型值(如'a‘)位于该特定的内存位置,则很容易看到输出,因为headerptr +2或headerptr +3会给您一个字节字符来读取。但是,如果您将整个范围用于结构并访问该集合的特定内存位置,那么它是如何工作的。你能接触到结构的一个成员吗?有些类型需要超过一个字节(Char),比如int,它需要4。假设成员是结构中声明的第一件事,并且是headerptr所指的第一件事,那么读取headerptr +3内存中的数据会给出什么信息呢?不考虑我们指向的4个字节中的值是空的?这对我来说很难想象,因为当我描绘char数组时,我只想到每个字符的一个单元格。如果我们有一个具有多个不同数据类型的结构,它为结构的每个成员占用多个单元格,并且我们指向特定的单元格,那么我们得到了什么?
发布于 2016-10-26 08:06:59
您的问题只有在p充分对齐的情况下才是有意义的,如果p指向char数组的开头就不能保证这一点,所以让我们假设struct header *p = malloc(100); (如果分配成功时返回的指针适合于任何类型)。
但首先,你的帖子里有一种奇怪的措辞:
sizeof of ( struct头)是结构本身加上成员的字节计数。
结构本身已经包含了它的成员,所以加号成员没有意义。
如果我声明headerptr->isfree和headerptr ->大小等于某个值,同时让指针先前和后继保存一个内存位置,这是否意味着headerptr指向的位置最多可以在结构及其成员中使用24字节?
确切地说,它将是headerptr指向23个字节之后的字节,总计为24个字节。
如果我最终访问headerptr + 3的内存位置会发生什么?
由于headerptr是struct header *类型的,而从分配的内存开始时有24个字节,所以headerptr + 3是72字节之后,即从开始到96字节。现在发生的事情取决于您如何访问该位置。
如果一个普通的char数据类型值(如'a‘)位于该特定的内存位置,则很容易看到输出,因为headerptr +2或headerptr +3会给您一个字节字符来读取。但是,如果您将整个范围用于结构并访问该集合的特定内存位置,那么它是如何工作的。你能接触到结构的一个成员吗?
当您编写headerptr +3时,您似乎是指(char *)headerptr + 3;从现在开始,我将假设这一点。此外,只有使用unsigned char类型才能安全地访问大小大于1的对象的单个字节。这样,我们就可以访问一个struct成员的一个字节。
假设成员是在结构中声明的第一件事,并且是headerptr指向的第一件事,那么读取headerptr +3内存中的数据会给出什么信息呢?
然后,((unsigned char *)headerptr)[3]生成isfree的第四个字节的值,条件是sizeof isfree至少为4。
如果我们有一个具有多个不同数据类型的结构,它为结构的每个成员占用多个单元格,并且我们指向特定的单元格,那么我们得到了什么?
我们得到了所要求的-一个字节或单元或(单字节)字符,如上面的示例所示。
https://stackoverflow.com/questions/20463964
复制相似问题