【发布时间】:2020-09-03 16:33:00
【问题描述】:
这里我试图将下一个block_t 的地址写入前一个块具有其有效负载结构的地址。这只是我正在测试的一个 PoC,以便稍后集成到我的主代码中。但是,它不会将地址写入下一个块,而是将地址写入自身,正如您在看到输出时会注意到的那样。
编辑 1:所以我想现在的问题归结为“如何重用分配给有效负载的指针以指向另一个块?”
#include <stdio.h>
#include <stdlib.h>
typedef unsigned word_t;
typedef struct block {
word_t header;
char payload[0];
} block_t;
static void set_next_free_block(block_t *block, block_t *nblock) {
// Store the address of next block at the location where payload starts
word_t *next_address = (word_t *)(block->payload);
// Now write the address of next block here
*next_address = nblock;
return;
}
static block_t *get_next_free_block(block_t *block) {
block_t *next_address = (block_t *)((word_t *)block->payload);
return next_address;
}
int main() {
block_t *block = (block_t *)malloc(sizeof(block_t));
block_t *nblock = (block_t *)malloc(sizeof(block_t));
block_t *next = NULL;
set_next_free_block(block, nblock);
next = get_next_free_block(block);
printf("Block 1\nBlock address: %16x\n", (word_t)block);
printf("Payload address: %16x\n", (word_t)block->payload);
printf("Next: %16x\n", (word_t)next);
printf("Block 2\nBlock address: %16x\n", (word_t)nblock);
return 0;
}
我不明白为什么我在set_next_free_block中设置的指向nblock的地址的地址指向错误的地址。
当我运行它时,我得到:
【问题讨论】:
-
首先
char payload[0];在 ISO C 中是不允许的,所以你依赖于编译器扩展 -
*next_address = nblock;只是写入超出分配范围(导致未定义的行为)。也许你想要word_t *payload;而不是char payload[0]; -
我不完全确定您要做什么(例如,如果这是一个链表内存分配器,您将同时拥有下一个块指针和有效负载)
-
目前您没有为有效负载分配任何空间,因此您将不得不更改该部分设计。如果您将有效负载与块内联,那么您需要为块分配空间(例如,
malloc(sizeof(block_t) + 100)用于 100 字节有效负载) -
您没有空间容纳单个指针。
char payload[0];(可能在通常的编译器扩展中)是一个没有空格的零大小数组。word_t *payload;将是单个指针
标签: c arrays pointers malloc dynamic-memory-allocation