段错误尝试查找树的底部节点并添加到 C 中的动态数组

问题描述 投票:0回答:1

当调用 init_model() 函数时,我尝试递归地遍历树并将指针附加到树节点指针数组中的最低树节点。但是,当我遍历列表并尝试打印它时,我遇到了段错误。

void rec_find_inputs(TreeNode* root, TreeNode** arr, int* len_arr) {
    if (!(root->num_children)) {
        arr = realloc(*arr, *len_arr * sizeof(TreeNode*));
        arr[*len_arr] = root;
        (*len_arr)++;
    } else {
        for (int i = 0; i < root->num_children; i++) {
            rec_find_inputs(root->children[i], arr, len_arr);
        }
    }
}


void init_model(TreeNode* neuron_config) {
    int rec_params_len = 0;
    TreeNode** rec_params_arr = (TreeNode**) malloc(sizeof(TreeNode*) * 1);

    rec_find_inputs(neuron_config, rec_params_arr, &rec_params_len);

    printf("--------------\n");
    printf("%d\n", rec_params_len);
    for (int i = 0; i < rec_params_len; i++) {
        printf("%f\n", rec_params_arr[i]->data);
    }
}

我不确定这是否是我分配内存的方式有问题,或者我是否错误地迭代了数组。

c data-structures malloc realloc
1个回答
0
投票

这段代码

arr = realloc(*arr, *len_arr * sizeof(TreeNode*));
arr[*len_arr] = root;

无效。

数组已分配

*len_arr
个元素。所以索引的有效范围是
[0, *len_arr)
。然而,在范围之外使用了无效索引
*len_arr

arr[*len_arr] = root;
© www.soinside.com 2019 - 2024. All rights reserved.