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

あなたが尋ねる

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)しかし、s のカウントではない余分なバイトを割り当てたため、実際には意味がありませんint。あなたがそれをどうしたいかは明らかではありませんがfree_btree_node、 はポインターであり、そのサイズに関心がないため、確かに正しくありません...おそらくsizeof(*free_btree_node). しかし、何が何であるか、またはなぜそれを行っているかを説明するコメントがないため、コードは理解できません。特に、malloc には、割り当てていると思われるものを正確に示すコメントが必要です...おそらく小さな図です。または、連続した構造を割り当てようとするのをやめて、それぞれの種類のものを個別に割り当てることもできます。

(*btree_start).nodes 

使ってください

btree_start->nodes 

それは標準的な使用法であり、より簡潔で、より理解しやすいものです...

于 2012-10-06T23:22:22.033 に答える
1

本当にすべてを 1 つの構造に保持したい場合、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 に答える