gcc:使用sizeof值转发指针地址

时间:2012-10-06 22:38:57

标签: c pointers gcc struct malloc

使用此代码:

#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);

或者这是否可能完全错误?如果是这样我该怎么做?我将做一些类似于最初填充未使用的二进制树节点的表。

2 个答案:

答案 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 

它的标准用法,更简洁,更易于理解......