预分配内存的空指针错误?

Null Pointer Error with pre-allocated memory?

在用 C 语言进行编码练习时,我不得不为指向结构 (cur) 的指针分配内存,即使该结构可能已经为它预先分配了内存,否则我会得到'assignment to null pointer' 类型的错误。

我的假设是,如果指针将指向一个具有预分配内存的结构,那么分配更多内存将是多余的?澄清一下,代码编译和运行没有错误,只是对为什么我需要分配内存来实现预期行为感到困惑。

/* create a stack */
typedef struct {
    int top;
    struct TreeNode array[MAX_ARR_SIZE];
} Stack;

int node_comparator(const void *p, const void *q);

struct TreeNode *increasingBST(struct TreeNode *root) {
    /* add all the nodes to an array via DFT */
    int i, sorted_pos = 0;
    struct TreeNode *start, *cur;
    struct TreeNode sorted_nodes[MAX_ARR_SIZE];
    Stack *node_stack = malloc(sizeof(Stack));
    
    node_stack->top = -1; 
    node_stack->array[++node_stack->top] = *root;
    
   /* below is the pointer in question 
    * originally, this line was not here */
    cur = malloc(sizeof(struct TreeNode));
    
    while (node_stack->top != -1) {
        /* "pop" node off stack */
        *cur = node_stack->array[node_stack->top--];
        
        /* add node to array */
        sorted_nodes[sorted_pos++] = *cur;
        
        /* add right and left node to stack, if present */
        if (cur->right != NULL)
            node_stack->array[++node_stack->top] = *cur->right;
        
        if (cur->left != NULL)
            node_stack->array[++node_stack->top] = *cur->left;
    }
/* etc... */

这里有一个 link 的要点以获得完整的上下文。谢谢!

额外的内存不是多余的,因为您要将节点的详细信息保存在堆栈之外。但是,您不需要使用 malloc。您可以在函数顶部声明 cur (struct TreeNode cur;),然后使用 memcpy(来自 string.h)。

memcpy(&cur,&node_stack->array[node_stack->top--],sizeof(cur));

由于 cur 不再是指针,您需要编辑代码并将出现的 cur-> 替换为 cur.