C 特定地址处的动态结构数组

C 特定地址处的动态结构数组,c,pointers,struct,kernel,C,Pointers,Struct,Kernel,我试图在内存中的特定地址动态分配以下结构的数组。我使用指针struct page\u frame*memBlocks作为数组的起点,但是在for循环中,每次使用memBlocks[I]访问下一个元素只移动8个字节。我在gdb中检查了结构的大小,它显示了预期的16个字节,那么为什么对指针的访问是这样的呢 struct page_frame{ struct page_frame* next; //Next node of linked list int used; }; struct page_

我试图在内存中的特定地址动态分配以下结构的数组。我使用指针
struct page\u frame*memBlocks
作为数组的起点,但是在for循环中,每次使用
memBlocks[I]
访问下一个元素只移动8个字节。我在gdb中检查了结构的大小,它显示了预期的16个字节,那么为什么对指针的访问是这样的呢

struct page_frame{
struct page_frame* next; //Next node of linked list
int used;

};

struct page_frame* memBlocks;

memBlocks = (struct page_frame*)0xffffffff80000000 + physFree;
int indices = ((int)physEnd/4096)


for(int i = 0; i < indices; i++)
{
    struct page_frame temp;
    temp.used = 3;
    temp.next = (struct page_frame*)&memBlocks[i+1];
    memBlocks[i] = temp;
}
struct page\u框架{
struct page_frame*next;//链表的下一个节点
使用int;
};
结构页面_frame*memBlocks;
memBlocks=(结构页面\框架*)0xffffffff80000000+physFree;
int索引=((int)physEnd/4096)
对于(int i=0;i
我通过将每个元素设置为temp来覆盖我的结构。我能够用以下方法修复它

struct page_frame* memBlocks = (struct page_frame*)0xffffffff80000000 + physFree;

int indices = ((int)physEnd/4096);
//struct page_frame arr[physEnd];


for(int i = 0; i < indices; i++)
{

    memBlocks[i].used = 1;
    memBlocks[i].next = &memBlocks[i+1];

}
struct page_frame*memBlocks=(struct page_frame*)0xffffff8000000+physFree;
int指数=((int)physEnd/4096);
//结构页\帧arr[physEnd];
对于(int i=0;i
您没有向我们提供足够的关于目标体系结构(x86、x64?)的信息,也没有显示memblock的类型,但考虑到您使用强制转换的方式,我怀疑您的强制转换运算符需要应用于括号中的表达式。演员演员绑得很紧。physFree是以字节为单位,还是以page_frame为单位?看起来memBlocks没有声明为struct page_frame变量。所以,不管它是什么类型,都可能只有8字节大小。因此,当您将其作为数组下标进行索引时,您将只增加memBlocks变量的原始大小,不管它是什么。您不分配任何内容,只需将一个整数强制转换为指针。这首先是未定义的行为。由于这似乎是一个64位的值,我认为您已经有了一个完整的操作系统。什么使你认为这会起作用?什么是
physFree
?希望不是你试图应用的字节偏移量。我添加了内核标记,因为人们认为你正在编写一个普通的用户级应用程序。在您的问题中包含这一非常重要的细节会很有帮助。这仍然是未定义的行为,因为memBlocks(指针)被设置为一个值,但该值不是为
struct page\u frame
structs数组分配的内存。感谢您的帮助。不过,我正在创建一个物理页帧分配器,因此目前无法分配内存。这就是为什么我把它放在内核末尾的特定地址。此外,我不希望它的大小为4KB页面,因为我将使用数组跟踪所有物理4KB页面,因此结构必须更小。