我对于将类型结构转换为固定大小数组中的某个内存位置然后想要访问结构所用范围内的特定内存位置意味着什么。例如:
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 header类型的指针,而sizeof(struct header)是结构本身加上成员的字节数。
所以我检查并且sizeof(struct header)是24个字节。现在我有一个char数组,每个1字节,所以1 * 100 =数组大小。我接受位于数组开头的指针p并将其移动24个字节(无论该内存位置是什么),这就是headerptr将指向的内容。如果我声明headerptr-> isfree和headerptr->大小等于某事以及指针先前和后继保持一个内存位置,这是否意味着从headerptr指向最多24个字节后将用于结构及其成员?
第二个问题,假设上面的答案是肯定的,如果我最终访问headerptr + 3的内存位置会发生什么?如果普通的char数据类型值(例如'a')位于该特定的内存位置,则很容易看到输出,因为headerptr +2或headerptr +3会给你一个1字节的char来读取。但是,如果您将整个范围用于结构并访问该集合的特定内存位置,它是如何工作的。你可以访问结构的一个成员吗?有些类型占用超过1个字节(char),就像int取4个。假设成员isfree是结构中声明的第一个东西,它是headerptr指向的第一个东西,读取headerptr +内存中的数据是什么3给?无论我们指向的4个字节中的哪个位置都是isfree的值?我很难想象这个,因为当我描绘char数组时,我只想到每个字符1个单元格。如果我们有一个具有多个不同数据类型的结构,它为结构的每个成员占用多个单元格,并且我们指向一个特定的单元格,我们得到了什么?
答案 0 :(得分:0)
只要p
充分对齐,您的问题才有意义,如果p
指向char
数组的开头,则无法保证,所以让我们假设struct header *p = malloc(100);
(如果分配成功,则返回的指针适合任何类型)。
但首先,你的文章中有这种奇怪的措辞:
sizeof(struct header)是struct本身的字节数加上 成员。
struct本身已包含其成员,因此加上成员没有意义。
如果我声明headerptr-> isfree和headerptr->大小等于某事 以及指针前一个和后继者保持记忆 位置,这是否意味着从headerptr指向的位置到达 之后大多数24个字节将用于struct及其成员?
确切地说,它将是字节headerptr指向之后的23个字节,总共24个字节。
如果我最终访问headerptr +的内存位置会发生什么 3?
由于headerptr
的类型为struct header *
,并且从分配的内存开始处有24个字节,headerptr + 3
之后是72个字节,i。即从一开始就是96个字节。现在发生的事情取决于您访问该位置的方式。
如果是普通的char数据类型值,很容易看到输出 例如'a'位于该特定的内存位置,因为headerptr +2 或headerptr +3会给你一个1字节的字符来读取。但是怎么做呢 如果您使用整个范围的结构,并访问a 该集的特定内存位置。你能获得其中一个吗? 结构的成员?
当你写headerptr +3
时,你的意思是(char *)headerptr + 3
;我会假设从这里开始。此外,对大小大于1的对象的单个字节的访问仅对类型unsigned char
是安全的。这样我们就可以访问其中一个struct成员的一个字节。
假设成员isfree是结构中声明的第一个东西 这是headerptr指向的第一件事,阅读是什么 headerptr + 3内存中的数据给出了什么?
((unsigned char *)headerptr)[3]
然后会产生isfree
的第四个字节的值,前提是sizeof isfree
至少为4。
如果我们有一个具有多种不同数据类型的结构 结构的每个成员的多个单元格,我们指向a 特定细胞,我们得到什么?
我们得到了我们要求的内容 - 一个字节或单元格或(单字节)字符,如上例所示。