指针算术导致错误的地址写入

问题描述 投票:1回答:1

[这里,我尝试将下一个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地址的添加地址指向错误的地址。

当我运行它时,我得到:

Output of above code

c arrays pointers malloc dynamic-memory-allocation
1个回答
0
投票

所以使用功能set_next_free_block,您正在尝试将nblock的地址存储在block->payload中,对吗?

首先,我将char payload[0]更改为word_t以正确存储地址。 char payload[0]对我来说真的没有多大意义。

然后我只是将nblock指针转换为word_t以获取其地址并将其存储在block->payload中。

并且在get_next_free_block函数内部,无需将block->payload强制转换为word_t *,然后再次将其强制转换为block_t *

此代码是否提供您想要的结果?

#include <stdio.h>
#include <stdlib.h>

typedef unsigned word_t;

typedef struct block {
    word_t header;
    word_t payload;
} block_t;

static void set_next_free_block(block_t *block, block_t *nblock) {
    block->payload = (word_t)nblock;
    return;
}

static block_t *get_next_free_block(block_t *block) {
    return (block_t *)block->payload;
}

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:\t\t%16x\n", (word_t)block);
    printf("Payload address:\t%16x\n", (word_t)block->payload);
    printf("Next:\t\t\t%16x\n", (word_t)next);
    printf("Block 2\nBlock address:\t\t%16x\n", (word_t)nblock);
    getchar();

    return 0;
}

我得到以下内容:

Block 1
Block address:                   15a4a10
Payload address:                 15a4a48
Next:                            15a4a48
Block 2
Block address:                   15a4a48
© www.soinside.com 2019 - 2024. All rights reserved.