使用此代码:
#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);
或者这是否可能完全错误?如果是这样我该怎么做?我将做一些类似于最初填充未使用的二进制树节点的表。
答案 0 :(得分: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];
答案 1 :(得分: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)
个额外字节,这不是int
的计数。它不清楚你想要的是什么,但它肯定是正确的,因为free_btree_node
是一个指针而你对它的大小没兴趣...你可能意味着{{1 }}。但是你的代码是不可穿透的,因为没有任何评论可以解释你做什么或为什么做事。特别是,你的malloc应该有一个评论,说明你认为你正在分配什么......甚至可能是一个小图。或者你可以放弃尝试分配连续的结构并独立分配每种东西。
sizeof(*free_btree_node)
请使用
(*btree_start).nodes
它的标准用法,更简洁,更易于理解......