0

我有一些内存,我尝试将它分成几部分。所以我有一个链表。每个节点跟踪分配的内存块的大小和下一个节点。

当我将指针返回给请求者时,我会在该节点结束后立即返回一个指针(比如 return newNode + sizeOf(node)),因为请求者只需要使用内存。

问题是当我尝试通过更改节点来释放它时。当使用指针调用 myFree 并且我执行指针 - sizeOf(node) 以到达节点时,它不起作用。

我究竟做错了什么?

我认为它没有用,但这里有一些代码:

#define HEADER(24)
printf("Original pointer %-10p\n", pointer);
head *toUse = pointer + HEADER;
printf("Pointer to memory to be used %-10p\n", toUse);
printf("Trying to read the header again %-10p\n", toUse - HEADER);

第一个和第三个 printf 给了我不同的地址。那就是问题所在。

至于测试,我一开始只分配了一块内存,还是不行。

4

3 回答 3

1

你没有给我们足够的代码来解决这个问题。不过,我可以猜测一下。

向我们展示pointer. 我猜它不是 head *pointer;。指针算术将指针的类型考虑在内。

当您(例如)添加1一个指针时,int该指针按1 * sizeof int字节递增。如果类型是,short那么它将按1 * sizeof short字节递增。不一定是同一件事。

因此,如果pointeris(再次,例如)声明为char *pointerthen 添加HEADER它会使指针增加HEADER( 24) 个字节(因为sizeof char始终是1)。但是,当您稍后从类型中减去HEADER时,它会按字节递减。再次,不是同一件事。toUsehead*HEADER * sizeof head

于 2012-10-11T17:59:08.523 回答
1

在 C 中,(pointer + n)等价于&pointer[n]...,即索引计算指针指向的项目,而不是字节。如果您想要一个字节偏移量,请使用((char*)pointer + n). 但是在您的情况下,您不需要字节偏移量;代替

return newNode + sizeof(node);

你可以做

return newNode + 1;

或者

return &newNode[1];

(void*)尽管如果您要返回指向调用者可以用作任何类型的东西的指针,您可能希望将它们转换为。要从(void*)指针返回原始节点,请使用(node*)vp - 1(node*)((char*)vp - sizeof(node))

还,

#define HEADER(24)

不会编译,因为它类似于类似函数的宏;您需要在宏名称和左括号之间至少有一个空格(或省略括号)。

于 2012-10-11T18:46:25.177 回答
0

可以在这里使用更多代码来确定......但我将把它扔给你。你说:

have some memory and I try to allocate it in several pieces. So I have a linked list. Each node keeps track of the size the allocated piece of memory is and the next node.

所以我猜你正在创建节点,并malloc()给它们一些内存,然后尝试做一些类似的事情:

ptr_to_next_node = ptr_to_current_node+sizeof(node);

好吧,那是行不通的。您不能对链表进行指针运算,因为它不是连续的内存。指针运算适用于数组的原因是因为您获得的内存将是连续的:

 char array [0][1][2][3]
             ^  ^  ^  ^
             |  |  |  +----------0x86C00004
             |  |  +-------------0x86C00003
             |  +----------------0x86C00002              
             +-------------------0x86C00001

 linked_list 

    +-------+        +-------+        +-------+
    | node1 |        | node2 |        | node3 |
    | next---------->| next---------->| next---------->NULL
    +-------+        +-------+        +-------+
    (0x86C0001)      (0x86C000A)      (0x86C00BC)

好的,所以内存中的值可能不是最有意义的,但你可以看到我在这里试图说明的点。数组彼此sizeof(type)分开,您分配给节点的内存几乎可以在任何地方,我们不能只添加偏移量,这就是为什么它们有指向next.

如果您希望能够来回跳转,则需要添加指针 forwardnext和 backwards prev

于 2012-10-11T19:24:04.643 回答