对于将类型结构强制转换为固定大小的数组中的某个存储位置然后想要访问用于该结构的范围内的特定存储位置的含义,我有些困惑。例如:

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个字节(字符),例如int占用4。假定成员isfree是结构体中声明的第一件事,并且它是headerptr指向的第一件事,它是如何读取headerptr +的内存中的数据的3给?不管我们指向4个字节中的哪个位置,isfree的值都是多少?对于我来说,这很难想象,因为当我描绘char数组时,我只想到每个字符1个单元格。如果我们有一个具有多个不同数据类型的结构,该结构为该结构的每个成员占用了多个单元格,并且我们指向一个特定的单元格,那么我们会得到什么?

最佳答案

您的问题只有在p足够对齐的情况下才有意义,如果p指向char数组的开头不能保证,所以我们假设struct header *p = malloc(100);(如果分配成功返回的指针已适当对齐)对于任何类型)。

但是首先,您的帖子中有一个奇怪的措辞:


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


结构本身已经包含其成员,因此plus成员没有意义。


  如果我声明headerptr-> isfree和headerptr-> size等于某个值
  以及指针的前一个和后一个保留一个内存
  位置,是否意味着headerptr指向的位置一直到
  之后的最多24个字节将用于struct及其成员?


确切地说,它将是headerHeader指向之后的23个字节的字节,总计24个字节。


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


由于headerptr的类型为struct header *,并且从分配的内存开始起为24个字节,因此headerptr + 3在i之后为72个字节。 e。从头开始为96个字节。现在,发生什么情况取决于您访问该位置的方式。


  如果一个纯char数据类型值很容易看到输出
  如'a'位于该特定的内存位置,因为headerptr +2
  或headerptr +3将为您提供1个字节的char来读取。但是怎么办
  如果您将整个范围用于结构,并且您访问了
  该集合的特定内存位置。您可以访问以下其中一项吗?
  结构的成员?


当您写headerptr +3时,您的意思似乎是(char *)headerptr + 3;我假设从现在开始。同样,只有使用unsigned char类型,才可以安全地访问大小大于1的对象的各个字节。这样,我们将可以访问其中一个结构成员的一个字节。


  假设成员是free,是在struct和
  这是headerptr指向的第一件事,该怎么读
  headerptr + 3内存中的数据给?


如果((unsigned char *)headerptr)[3]至少为4,则isfree会产生sizeof isfree的第四个字节的值。


  如果我们有一个包含多个不同数据类型的结构
  该结构的每个成员都有多个单元格,我们指向一个
  特定的细胞,我们得到什么?


我们得到了我们想要的-一个字节或一个单元格或(单字节)字符,如上例所示。

关于c - 将struct类型转换为固定大小的数组的内存位置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20463964/

10-11 15:12