gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:42:39 24 4
gpt4 key购买 nike

我对将类型结构强制转换到固定大小数组中的某个内存位置然后想要访问该结构使用的范围内的特定内存位置意味着什么感到有点困惑。例如:

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 字节的字符来读取。但是,如果您使用结构的整个范围并访问该集合的特定内存位置,它会如何工作。您可以访问该结构的成员之一吗?有些类型占用超过 1 个字节(char),例如 int 占用 4 个字节。假设成员 isfree 是结构体中第一个声明的东西,并且它是 headerptr 指向的第一个东西,那么读取 headerptr + 内存中的数据是做什么的3 给? isfree 的值无论我们指向 4 个字节中的哪个位置?我很难想象这一点,因为当我描绘 char 数组时,我只想到每个字符 1 个单元格。如果我们有一个具有多种不同数据类型的结构体,该结构体的每个成员占用多个单元格,并且我们指向一个特定的单元格,我们会得到什么?

最佳答案

只有满足 p 时,您的问题才有意义。已充分对齐,如果 p 则不能保证这一点指向 char 的开头数组,所以我们假设 struct header *p = malloc(100); (分配成功时返回的指针针对任何类型进行适当对齐)。

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

sizeof(struct header) is the byte count of the struct itself plus the members.

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

If i declare headerptr->isfree and headerptr->size equal to something along with having the pointers previous and successor hold a memory location, does that mean that from where headerptr points to up to at most 24 bytes after will be used for the struct and its members?

准确的说,是headerptr指向的字节,一直到后面的23个字节,总共24个字节。

what happens if i end up accessing the memory location of headerptr + 3?

headerptr类型为struct header *以及从分配的内存开始处起的 24 个字节 headerptr + 3 i 之后是 72 个字节。 e.从开头算起 96 字节。现在发生的情况取决于您访问该位置的方式。

It would be easy to see the output if a plain char data type value such as 'a' was at that specific memory location because headerptr +2 or headerptr +3 would give you a 1 byte char to read. But how does it work if you used that entire range for a struct and you access a specific memory location of that set. Would you get access to one of the members of the struct?

当你写headerptr +3时,你的意思似乎是(char *)headerptr + 3 ;从现在开始我将假设这一点。此外,访问大小大于 1 的对象的各个字节仅对于类型 unsigned char 是安全的。 。这样我们就可以访问结构成员之一的一个字节。

Assuming member isfree is the first thing declared in the struct and it is the first thing that headerptr points to, what does reading the data inside the memory of headerptr + 3 give?

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

If we have a struct with multiple different data type that take up multiple cells for each members of the struct and we point to a specific cell, what do we get?

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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com