首页 文章

将类型struct转换为固定大小的数组的内存位置

提问于
浏览
0

关于将类型结构转换为固定大小数组中的某个内存位置然后想要访问结构所用范围内的特定内存位置,我有点困惑 . 例如:

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-> size等于某个指针以及指针前一个和后继指针保持一个内存位置,这是否意味着从headerptr指向最多24个字节后将用于结构及其成员?

第二个问题,假设上面的答案是肯定的,如果我最终访问headerptr 3的内存位置会发生什么?如果普通的char数据类型值(例如'a')位于该特定的内存位置,则很容易看到输出,因为headerptr 2或headerptr 3会给你一个1字节的char来读取 . 但是,如果您将整个范围用于结构并访问该集合的特定内存位置,它是如何工作的 . 你可以访问结构的一个成员吗?有些类型占用超过1个字节(char),就像int取4个 . 假设成员isfree是结构中声明的第一个东西,它是headerptr指向的第一个东西,读取headerptr 3内存中的数据是什么给?无论我们指向的4个字节中的哪个位置都是isfree的值?我很难想象这个,因为当我描绘char数组时,我只想到每个字符1个单元格 . 如果我们有一个具有多个不同数据类型的结构,它为结构的每个成员占用多个单元格,并且我们指向一个特定的单元格,我们得到了什么?

1 回答

  • 0

    只要 p 充分对齐,你的问题才有意义,如果 p 指向 char 数组的开头,则无法保证,所以让我们假设 struct header *p = malloc(100); (如果分配成功,则返回指针适合任何类型) .

    但首先,你的文章中有这种奇怪的措辞:

    sizeof(struct header)是结构本身加上成员的字节数 .

    结构本身已经包含其成员,因此成员的加号没有意义 .

    如果我声明headerptr-> isfree和headerptr-> size等于某个指针以及指针先前和后继保持一个内存位置,这是否意味着从headerptr指向最多24个字节之后将用于结构及其成员?

    确切地说,它将是字节headerptr指向之后的23个字节,总共24个字节 .

    如果我最终访问headerptr 3的内存位置会发生什么?

    由于 headerptr 的类型为 struct header * ,并且从分配的内存的开头起24字节, headerptr + 3 之后是72字节,i . 即从一开始就是96个字节 . 现在发生的事情取决于您访问该位置的方式 .

    如果一个普通的char数据类型值(例如'a')位于该特定的内存位置,那么很容易看到输出,因为headerptr 2或headerptr 3会给你一个1字节的char来读取 . 但是,如果您将整个范围用于结构并访问该集合的特定内存位置,它是如何工作的 . 你可以访问结构的一个成员吗?

    当你写 headerptr +3 时,你似乎是指 (char *)headerptr + 3 ;我会假设从这里开始 . 此外,只有类型 unsigned char 才能访问大小大于1的对象的单个字节 . 这样我们就可以访问其中一个struct成员的一个字节 .

    假设成员isfree是结构中声明的第一个东西,它是headerptr指向的第一件事,读取headerptr 3内存中的数据会给出什么?

    ((unsigned char *)headerptr)[3] 然后产生 isfree 的第四个字节的值,前提是 sizeof isfree 至少为4 .

    如果我们有一个具有多种不同数据类型的结构,它为结构的每个成员占用多个单元格,并且我们指向一个特定的单元格,我们得到了什么?

    我们得到我们要求的 - 一个字节或单元格或(单字节)字符,如在上面的例子中 .

相关问题