c - C 程序 - 二叉树的底视图
问题描述
我是一名 Java 开发人员,但我的任务是在 C 中为二叉树的底视图编写代码。我必须完成void bottomView(btree* root)
功能,但它在调用时给出了 SEGMENTATION FAULT void initializeQueue(queue* q)
。实际上我知道如何在 Java 中做到这一点,但我是 C 新手,所以很难解决这个问题。我知道这是一些内存分配问题。struct queue
&的主体void initializeQueue(queue* q)
如下,我不允许更改它们。请帮助:)
typedef struct queue{
btree* node[67];
int front;
int rear;
}queue;
void initializeQueue(queue* q){
int i;
for(i=0;i<67;i++) q->node[i] = NULL;
q->front=-1;
q->rear=-1;
}
void bottomView(btree* root){
int view[67];
queue* q;
//initializeQueue(q); Calling this gives SEGMENTATION FAULT
}
解决方案
这个:
queue* q;
在一个没有指向任何合理的地方的未初始化的指针中。*q
使用或取消引用它q->...
会导致未定义的行为,通常是崩溃。
在堆栈上创建一个未初始化的队列对象,然后使用 address-of 运算符创建指向它的指针&
并将该指针传递给初始化函数:
queue q; // uninitialized stack object
initializeQueue(&q);
另一种方法是在堆上创建队列malloc
,但您必须free
稍后显式创建:
queue *q = malloc(sizeof(*q)); // uninitialized heap object
// TODO: test for NULL
initializeQueue(q);
// use the queue q
free(q)
您可以结合分配和初始化:
queue *createQueue(void)
{
queue *q = malloc(sizeof(*q));
initializeQueue(q);
return q;
}
推荐阅读
- swift - 在 glkview 前置摄像头显示镜像问题
- flutter - Flutter 自定义叠加层
- java - 在edittext android Pie中检测语言类型?
- c++ - 如何在配置类型设置为动态链接库的解决方案中使用静态库?
- apache-nifi - 在 nifi 中使用属性存储 json 路径表达式对 json 到 json 的转换有任何性能 imapct 吗?
- file-upload - FileUpload 标记未在浏览器中呈现
- python - 刮刀没有在循环中产生结果?
- electron - 从源代码构建电子时如何为本机 c++ 插件生成 node.lib(就像 node-gyp 中使用的库)
- javascript - 下划线/Lodash:按键的子字符串对对象进行分组
- html - 有没有办法在 Bootstrap 中有多个整页容器?(规格在里面注明)