当前位置: 首页 > 知识库问答 >
问题:

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

喻增
2023-03-14

在用C进行编码练习时,我必须为指向结构(cur)的指针分配内存,即使该结构可能已经预先为它分配了内存,否则我将得到“赋值到空指针”类型的错误。

我的假设是,如果指针要指向一个预先分配内存的结构,那么分配更多的内存将是冗余的?为了澄清,代码编译和运行都没有错误,只是搞不清楚为什么我需要分配内存来实现预期的行为。

/* 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... */

这里有一个链接到一个要点,以了解完整的上下文。谢了!

共有1个答案

游高杰
2023-03-14

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

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

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

 类似资料:
  • 我想知道何时或是否必须删除此对象。下面是一个基本类对象Object.cpp的构造函数: 我知道在分配内存时,你应该在某个时候删除它,但是我在构造函数中分配了内存,并且想再次使用变量1和2,我什么时候删除它们?

  • 我有一个func添加两个NO并返回(a+B)。然后我创建了一个指向func的func指针。希望为该函数指针的数组分配内存并访问它们。代码如下。 我的问题是使用malloc的下面一行: 编译时,sizeof(add_2nos*)和sizeof(add_2nos)没有任何区别。如果有什么区别??另外,如果类型转换是必要的,而我正在分配相同类型的内存…?

  • 内存32位和64位的区别 ///01.Point.c #include <stdio.h> #include <stdlib.h> //01.指针变量所占用的内存尺寸由编译器进行直接决定 // 指针变量所占用的内存尺寸同时直接或间接与CPU-->操作系统-->编译器平台有关 // 综合决定:CPU-->操作系统-->编译器平台 // 直接决定:编译器

  • 我是一个尝试整合mybatis的新手。最终出现了这个空指针异常。 我的POM 我的Spring配置 我的地图绘制者 用户Bean 只是几个变量 我的DAO 控制器 错误 org.springframework.web.util.NestedServletExcture:请求处理失败;嵌套异常java.lang.NullPointerExctureorg.springframework.web.se