预分配内存的空指针错误?
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.
。
在用 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.
。