使用此代码:
#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);
或者这可能会完全出错?如果是,我该怎么做?我将做一些类似于最初填充未使用的二进制树节点表的事情。
如果你真的想把所有东西都放在一个结构中,一种方法是使用"灵活的数组成员":
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];
您询问
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
s的计数。目前还不清楚你想要它是什么,但它肯定不可能是正确的,因为free_btree_node
是一个指针,你对它的大小不感兴趣。。。你可能是指sizeof(*free_btree_node)
。但是你的代码是无法理解的,因为没有注释来解释事情是什么或者你为什么要做事情。特别是,你的malloc上应该有一条评论,确切地说你认为你在分配什么。。。甚至可能是一个小图表。或者,您可以放弃尝试分配连续的结构,而是独立地分配每种东西。
(*btree_start).nodes
请使用
btree_start->nodes
这是标准用法,更简洁,更容易理解。。。