无法将tree_node指针赋值给栈元素:原因及修复方案
问题:栈push函数类型不匹配错误原因及修复方案
相关代码
结构体定义与创建函数
typedef struct tree_node{ int table_node[4][4]; struct tree_node* parent; struct tree_node* children[4]; }tree_node; struct tree_node* new_Node(int **field, tree_node* parent){ tree_node* newNode = (tree_node*)malloc(sizeof(tree_node)); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { newNode->table_node[i][j] = field[i][j]; } } newNode->parent = parent; for(int i = 0; i < 4;i++) { newNode->children[i] = NULL; } return newNode; } typedef struct Stack{ int top; int capacity; tree_node* nodes; }Stack; struct Stack* new_Stack(){ struct Stack* stack = (struct Stack*)malloc(sizeof(struct Stack)); stack->capacity = 1000; stack->top = -1; stack->nodes = (tree_node*)malloc(stack->capacity * sizeof(tree_node)); }
出错的push函数
void push(struct Stack* stack, tree_node* node){ if(is_Full(stack)) return; stack->nodes[++stack->top] = node; }
错误原因
错误核心是类型不匹配:
Stack结构体中nodes被声明为tree_node*,但你通过malloc(stack->capacity * sizeof(tree_node))分配的是**tree_node类型的数组**(每个元素是完整的tree_node结构体)。push函数传入的node是tree_node*(指向结构体的指针),而stack->nodes[++stack->top]是tree_node类型的实体,直接赋值会导致指针类型无法赋值给结构体类型的错误。
修复方案
有两种可行的修复思路,推荐第一种:
方案1:栈存储节点指针(更高效,推荐)
这种方式栈里只存指针,避免拷贝大结构体,节省内存:
- 修改
Stack结构体的nodes为指针数组:
typedef struct Stack{ int top; int capacity; tree_node** nodes; // 改为二级指针,指向指针数组 }Stack;
- 修改
new_Stack中的内存分配语句,分配指针数组:
struct Stack* new_Stack(){ struct Stack* stack = (struct Stack*)malloc(sizeof(struct Stack)); stack->capacity = 1000; stack->top = -1; stack->nodes = (tree_node**)malloc(stack->capacity * sizeof(tree_node*)); // 分配指针数组 return stack; // 补充原代码遗漏的返回语句 }
push函数的赋值语句保持不变,此时stack->nodes是指针数组,每个元素类型为tree_node*,和传入的node类型匹配:
void push(struct Stack* stack, tree_node* node){ if(is_Full(stack)) return; stack->nodes[++stack->top] = node; }
方案2:栈存储节点实体(拷贝结构体)
这种方式会把整个节点结构体拷贝到栈中,内存开销大,仅适用于小型结构体:
- 保持
Stack结构体定义不变; - 修改
push函数,将指针指向的结构体内容拷贝到栈数组中:
void push(struct Stack* stack, tree_node* node){ if(is_Full(stack)) return; stack->nodes[++stack->top] = *node; // 拷贝结构体实体 }
注意:这种方式会拷贝
tree_node中的所有成员,包括指针(仅拷贝指针值,不拷贝指向的内容),如果节点包含动态分配的内存,可能引发内存管理问题,不推荐使用。
补充:is_Full函数实现
原代码中未提供is_Full函数,需要补充:
int is_Full(struct Stack* stack) { return stack->top == stack->capacity - 1; }
内容的提问来源于stack exchange,提问作者Aleksa2309
相关产品推荐
相关产品推荐

