【问题标题】:Void pointer to struct and accessing members指向结构和访问成员的无效指针
【发布时间】:2022-11-01 12:23:44
【问题描述】:

我正在摆弄和学习 void 指针和链表,我想我可能不得不在概念和应用上有点错误。

目前,我有一个 void 指针,它指向内存中结构的地址。然后我试图通过将 void 指针转换为该结构来访问该结构。但是,我没有得到预期值0.

代码如下。

void *data = ListGetItemAtIndex(freeList, i); // returns void *
memoryBlock *block = (memoryBlock *) data;
printf("%ld\n\n", block->startAddress);

结构:

typedef struct
{
    size_t startAddress;
    size_t memory;
} memoryBlock;

添加结构时的地址:

0x5593c4812720

无效地址 *:

0x5593c4812720

核心问题是,我如何使用这个 void 指针来访问结构中的数据。

要求的例子:

块创建

static memoryBlock* CreateMemoryBlockPointer(size_t startAdress, size_t size)
{
    memoryBlock block;

    block.startAddress = startAdress;
    block.memory = size;

    return malloc(sizeof(block));
}

任务:

memoryBlock *ptr = CreateMemoryBlockPointer(StartAddress, size);

// Add initial 1st element
ListAddTail(freeList, ptr);

原型:

int ListAddTail(linkedList *list, void* data)

添加到列表中

   el->data = data;
   el->next = NULL;

【问题讨论】:

  • 下面的代码代码如下是正确的,如果您只有一个指向结构的 void 指针,这就是您访问结构的方式。你的问题是什么?
  • 我的问题是为什么我的代码当前没有返回预期值 1000 而不是返回 0
  • edit 并显示minimal reproducible example。您未显示的代码中可能存在错误。
  • return malloc(sizeof(block)); 返回新分配的、未初始化的内存。它确实不是包含您写入本地 block 变量的值
  • 哦,天哪,你是对的。那里有点脑残。我将如何访问这些成员。请原谅这个简单的问题,但我的大脑似乎不太了解这个问题

标签: c struct casting void


【解决方案1】:

已解决,请参阅:

先分配内存,再写入内存,例如:

memoryBlock *block = malloc(sizeof(*block));
block->startAddress = startAddress;

等然后返回块;在函数的最后——

  • @UnholySheep

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2021-12-17
    • 2019-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多