1

使用此代码:

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

int j_btree_create (int fn_initial_nodes);

typedef struct {
    int depth;
    int value;
    void *item;
    void *left_pointer;
    void *right_pointer;
} j_btree_node_int;

typedef struct {
    int nodes;
    int available_nodes;
    int btree_extension;
} j_btree_descriptor_int;



int j_btree_create (int fn_initial_nodes) {
    int *free_btree_node;
    int loop_counter;
    j_btree_descriptor_int *btree_start;

    btree_start = (j_btree_descriptor_int *) malloc (((sizeof(j_btree_node_int) + sizeof(free_btree_node)) * fn_initial_nodes) + sizeof(j_btree_descriptor_int));

    (*btree_start).nodes = fn_initial_nodes;
    (*btree_start).available_nodes = fn_initial_nodes;
    (*btree_start).extension = NULL; */
    for (loop_counter = 0; loop_counter < fn_initial_nodes; loop_counter++) {
        printf ("loop_test: %d", loop_counter);
    }
}

我想要一个指向二叉树描述符之后位置的指针(基本上是 btree_start 的结构)

我可以这样做吗

free_btree_node = btree_start + sizeof(j_btree_descriptor_int);

或者这可能会完全出错?如果是这样,我该怎么做?我将做一些类似于最初填充未使用的二叉树节点表的事情。

4

2 回答 2

1

如果您真的想将其全部保存在一个结构中,一种方法是使用“灵活数组成员”:

typedef struct {
    int *value;
    j_btree_node_int node;
} j_btree_node;

typedef struct {
    j_btree_descriptor_int btree_start;
    j_btree_node nodes[0];
} j_btree;

j_btree *btree = malloc(sizeof(j_btree) + fn_initial_nodes * sizeof(j_btree_node));
free_btree_node = &j_btree->nodes[0];
于 2012-10-06T22:52:15.813 回答
1

你问关于

free_btree_node = btree_start + sizeof(j_btree_descriptor_int);

由于指针算法的规则,它隐式地将偏移量乘以类型的大小,这相当于

free_btree_node = &btree_start[sizeof(j_btree_descriptor_int)];

这不是你想要的。你想要的是

free_btree_node = (int*)&btree_start[1];

或者,等效地,

free_btree_node = (int*)(btree_start + 1);

是的,您可以这样做,因为您分配了额外的空间。但这并没有真正意义,因为您分配((sizeof(j_btree_node_int) + sizeof(free_btree_node)) * fn_initial_nodes)了额外的字节,这不是ints 的计数。目前尚不清楚你想要它是什么,但它肯定不可能是正确的,因为free_btree_node它是一个指针,你对它的大小不感兴趣......你可能的意思是sizeof(*free_btree_node). 但是你的代码是难以理解的,因为没有注释解释什么是什么或者你为什么要这样做。特别是,应该对您的 malloc 进行评论,准确说明您认为您正在分配的内容......甚至可能是一个小图表。或者您可以放弃尝试分配连续结构并独立分配每种事物。

(*btree_start).nodes 

请用

btree_start->nodes 

这是标准用法,更简洁,更易于理解......

于 2012-10-06T23:22:22.033 回答