- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这里是第一篇文章。
几周前我开始使用 CodeBlocks 学习 C,一切都很顺利,直到今天,我遇到了这个令人绞尽脑汁的崩溃问题;我能够生成一个二叉树作为独立程序,但是每当我添加一些其他函数来使用生成的树时,我的程序就会崩溃,我什至无法理解在哪里是否发生错误。
我必须重现下面的二叉树来制作莫尔斯翻译器:
所以我先做了一个名为BinaryTree的程序,它运行得很好。因此,我在一个名为 MorseTranslate 的新项目文件中复制/粘贴了 .c 和 .h 文件。但是,由于我在 MorseTranslate.c 源文件中添加了一些行和函数,因此该程序无法再运行。因此,第一 react 是,我尝试通过在前面添加“//”来跳过对 morseTranslate(tree) 的函数调用。由于某种原因,它仍然无法工作并且偶尔,尽管有注释调用,它甚至访问了该函数!(我记得见过很多次,但我不记得实现它的条件发生)。它仍然显示无警告!
我刚刚发现我可以使用调试器,所以我设置并运行它。以下是从“where”调试器命令返回的错误日志:
#0 0x00007ff9b52d2477 in ntdll!RtlpNtSetValueKey () from
C:\WINDOWS\SYSTEM32\ntdll.dll
#1 0x00007ff9b522e62b in ntdll!EtwEventEnabled () from
C:\WINDOWS\SYSTEM32\ntdll.dll
#2 0x00007ff9b5299a24 in ntdll!memset () from C:\WINDOWS\SYSTEM32\ntdll.dll
#3 0x00007ff9b526127d in ntdll!RtlCreateHashTableEx () from
C:\WINDOWS\SYSTEM32\ntdll.dll
#4 0x00007ff9b52895c9 in ntdll!memset () from C:\WINDOWS\SYSTEM32\ntdll.dll
#5 0x00007ff9b52011ed in ntdll!RtlFreeHeap () from
C:\WINDOWS\SYSTEM32\ntdll.dll
#6 0x00007ff9b4f3995c in msvcrt!free () from C:\WINDOWS\System32\msvcrt.dll
#7 0x000000000040192f in morseTranslate (tree=0xbe16a0) at
D:\CodeBlocks\Projects\MorseTranslate_v1\MorseTranslate.c:25
#8 0x0000000000401877 in main () at
D:\CodeBlocks\Projects\MorseTranslate_v1\main.c:20
我已经浏览了很多帖子和论坛,但我仍然不明白为什么我的程序不再工作。 我很确定这是因为我用于树生成的 malloc() 或 free(tree) 函数,但我不知道自从我执行了 <在 MorseTranslate.c 中的 switch/case 函数之后分配并释放内存之后进行strong>NULL检查。所以我现在完全被困在这里了。
无论如何,我必须在 6 小时内将我的代码发送给我的老师,所以我想已经晚了,但我真的很想理解为什么当二叉树生成程序单独工作时这不起作用......现在我感到有点沮丧,因为我知道如何制作翻译器,但由于这个奇怪的错误而无法制作。
提前谢谢您。
main.c
#include <stdlib.h>
#include "BinaryTree.h"
#include "MorseTranslate.h"
int main(){
Node *tree;
int depth = 5;
binTree(tree, depth);
morseTranslate(tree);
getchar();
return 0;
}
BinaryTree.c
#include <stdio.h>
#include <stdlib.h>
#include "BinaryTree.h"
void binTree(Node *tree, int depth){
char letters[31] = {'\0', 'E', 'T',
'I', 'A', 'N', 'M',
'S', 'U', 'R', 'W', 'D', 'K', 'G', 'O',
'H', 'V', 'F', ' ', 'L', ' ', 'P', 'J',
'B', 'X', 'C', 'Y', 'Z', 'Q', ' ', ' '};
int totalNodes = (pow(2, depth)-1);
tree = malloc(totalNodes*sizeof(Node));
if(tree == NULL){ //checker
printf("OOPS!");
return 0;
}
binTreeGen(totalNodes, totalNodes, tree, letters);
}
void binTreeGen(int i, int totalNodes, Node *tree, char *letters){
if(i>=totalNodes/2){
tree[i].data = letters[i];
tree[i].right = NULL;
tree[i].left = NULL;
}else{
tree[i].data = letters[i];
tree[i].right = &tree[2*i+2]; //2i+2 right
tree[i].left = &tree[2*i+1]; //2i+1 left
}
if(i>0)
binTreeGen(i-1, totalNodes, tree, letters);
}
MorseTranslate.c(writeMorse()故意为空,还没写)
#include <stdio.h>
#include <stdlib.h>
#include "BinaryTree.h"
#include "MorseTranslate.h"
void morseTranslate(Node *tree){
int selected = 3;
while(selected>2||selected<0){
printf("Choose your translation mode :\n1 : READ MORSE\n2 : WRITE MORSE\n0 : LEAVE\n");
scanf("%d", &selected);
switch(selected){
case 1: readMorse(tree);
break;
case 2: writeMorse(tree);
break;
case 0: printf("\nleaving...\n");
break;
default: printf("\nERROR : NOT AVAILABLE !\n");
}
}
free(tree);
}
void readMorse(Node *tree){
char code[256] = {'\0'}; //stores morse code
int cursor = 0; //read cursor for morse code array
int morseCursor = 0; //index for morse binary tree array
bool stopRead = false; //bool to stop the while loop
bool isSpace = false; //bool to recognize one morse letter
system("cls");
printf("Input your morse code with dots '.' and dashes '-'.\nPlease input space between two morse letters.\nDO NOT put spaces between dots and dashes in a same morse letter.\n");
getchar();
fgets(code, 256, stdin);
printf("\n\nTranslation : %s\n\n", code);
while(!stopRead){
switch(code[cursor]){
case '-' : morseCursor = 2*morseCursor+2;
break;
case '.' : morseCursor = 2*morseCursor+1;
break;
case ' ' : isSpace = true;
break;
case '\0': stopRead = true;
break;
default : printf("\nWARNING : SYMBOL No.%d ISNT A DOT '.' NOR A DASH '-' !\n", cursor+1);
}
if(isSpace){
printf("%c", tree[morseCursor].data);
morseCursor = 0;
isSpace = false;
}
cursor++;
}
}
void writeMorse(Node *tree){
}
BinaryTree.h
#ifndef BINARYTREE_H_INCLUDED
#define BINARYTREE_H_INCLUDED
#include <math.h>
typedef int bool;
#define true 1
#define false 0
typedef struct Node Node;
struct Node {
char data;
Node *left;
Node *right;
};
void binTree(Node *tree, int depth);
void binTreeGen(int i, int totalNodes, Node *tree, char *letters);
#endif // BINARYTREE_H_INCLUDED
莫尔斯翻译.h
#ifndef MORSETRANSLATE_H_INCLUDED
#define MORSETRANSLATE_H_INCLUDED
#include "BinaryTree.h"
void morseTranslate(Node *tree);
void readMorse(Node *tree);
void writeMorse(Node *tree);
#endif // MORSETRANSLATE_H_INCLUDED
最佳答案
该代码没有执行您认为正在执行的操作:
第一:调试技巧:为什么 free 会失败?或者你正在释放一些不是 malloc 的东西(或者像 strdup、calloc 等之类的 friend ),或者指针根本没有被分配......第一个选项看起来不太可能(程序中只有一个空闲...... .),所以怀疑第二个。
int main(){
Node *tree;
//...
binTree(tree, depth);
//...
}
void binTree(Node *tree, int depth){
// ...
// here is the error! malloc is stored in local variable
tree = malloc(totalNodes*sizeof(Node));
// ...
}
现在,malloc 是正确的,但它将结果指针存储在 binTree 的局部变量中,而不是 main 中的变量。在这种情况下,您想要的是:
int main(){
Node *tree;
//...
binTree(&tree, depth);
//...
}
void binTree(Node **tree, int depth){
// ...
// Now the malloc result is stored in the main's pointer.
*tree = malloc(totalNodes*sizeof(Node));
// ...
}
关于C : unknown memory issue ? - 二叉树练习,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46922333/
我想在我的 Tree 类中创建一个函数来遍历 n-ary Tree[T] 以取回具有 (level, T) 的元组,以便该 Tree 的用户可以执行类似 tree.traverse.foreach{
给定一个层次格式的数组,它们的直接子级存储在一个连续的数组中,返回一个 n 叉树 给定输入格式: [{'name':'a', 'level': -1}, {'name':'b', 'level
我要求教授给我一份另一个学期的旧作业。它是关于构建一个家谱,然后找到给定的两个节点之间的亲属关系。家谱是关于那美克星人(龙珠z)的,所以每个那美克星人都有一个父亲。 问题是输入是这样的: First
我正在尝试创建一个包含子 vector 的 n 叉树。 这就是我到目前为止所得到的。 在 node.h 文件中我有这个: #include #include using namespa
我正在尝试了解 n 叉树的预序遍历。我一直在阅读,我发现的所有示例都使用左子树和右子树,但是在 n 叉树中,什么是左子树,什么是右子树?有人可以给出一个很好的解释或伪代码吗? 最佳答案 而不是考虑 l
我应该反序列化一个 n 叉树。 这段代码创建了我的树: foodtree.addChildren("Food", { "Plant", "Animal" } ); foodtree.a
我正在尝试创建叉 TreeMap ,但仍然没有成功。这是我的代码: #include #include #include void procStatus(int level) { prin
我有一个二叉树,代表一个解析后的逻辑公式。例如,f = a & b & -c | d 由前缀表示法的列表列表表示,其中第一个元素是运算符(一元或二元),接下来的元素是它们的参数: f = [ |, [
我正在尝试根据给定的输入创建一棵树。那里将有一个根,包括子节点和子子节点。我可以实现树,在其中我可以将子节点添加到特定的主节点(我已经知道根)。但是,我试图弄清楚实现树的推荐方法是什么,我们必须首先从
我在 n 个节点上有一个完整的 19 元树。我标记所有具有以下属性的节点,即它们的所有非根祖先都是最年长或最小的 child (包括根)。我必须为标记节点的数量给出一个渐近界限。 我注意到 第一层有一
如何在不使用递归的情况下遍历 n 叉树? 递归方式: traverse(Node node) { if(node == null) return; for(Node c
我的树/节点类: import java.util.ArrayList; import java.util.List; public class Node { private T data;
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 4年前关闭。 Improve this questi
我在我的 Java 应用程序中有一个非 UI 使用的所谓的“k-ary”树,我想知道 javax.swing.tree 包是否是完成这项工作的正确工具,即使它与 Swing 打包在一起. 我有一类 W
我正在用 Java 实现 N 叉树;每个节点可以有尽可能多的节点。当我尝试 build 一棵树时,问题就来了。我有一个函数可以递归地创建一个特定高度的树,并根据节点列表分配子节点。当我调用该函数时,根
嗨,我有这段代码来搜索 n 叉树,但它不能正常工作,我不知道这有什么问题当搜索 n4 和 n5 时,它返回 n3怎么了? public FamilyNode findNodeByName(Family
哪个是 C 语言中 N 叉树的简洁实现? 特别是,我想实现一个 n 元树,而不是自平衡的,每个节点中的子节点数量不受限制,其中每个节点都包含一个已经定义的结构,例如: struct task {
#include #include #include typedef struct _Tree { struct _Tree *child; struct _Tree *
我正在编写文件系统层次结构的 N 叉树表示形式,其中每个节点都包含有关它所表示的文件/文件夹的一些信息。 public class TreeNode { private FileSystemE
如何在 R 中为给定数量的分支和深度构建 N 叉树,例如深度为 3 的二叉树? 编辑:将源问题与问答分开。 最佳答案 我想提出解决方案,我用它来构建树数据结构 叶安姆 分支因子。要将数据存储在树中,字
我是一名优秀的程序员,十分优秀!