我目前正在研究霍夫曼编码程序。我有一个名为huffencode.c的文件,该文件随后通过头作为链接,该头通过下面的我的主要功能encodeFile()起作用。
下面的函数makeCodes()使用memcpy
在行中给我一个Seg错误。运行gdb时我得到了SIGSEGV,说__memcpy_sse2_unaligned
在您可以认为此文件的主目录encodeFile()
中调用了makeCodes()函数。我正在传递makeCodes()一个在另一个运行良好的函数中内置的排序链表,一个char指针来保存正在生成的当前代码,一个symCodes数组来保存每个符号的代码以及huffmanTree的深度。
makeCodes()应该按照霍夫曼cdoing算法的预期工作,如果当前节点不是叶子,则我向左横向添加代码0,然后向右添加一个代码1。如果节点是叶子,则我已到达符号,并且该符号的当前代码已完成,我可以通过节点符号将该代码添加到其正确位置。
为了同时使用不同版本的代码,以便我可以一次横穿整个树,我正在尝试为当前代码的副本分配内存,并且将copyedCode的大小设置为255 * size(char),因为代码只能是255位的长度。然后,我尝试将代码复制到复制的代码中,并且长度可能最大。我的错误在这里某处。
任何提示表示赞赏。
struct HuffmanTreeNode
{
char symbol;
unsigned long freq;
char code[256];
struct HuffmanTreeNode *left, *right;
struct HuffmanTreeNode* next;
};
void makeCodes(
struct HuffmanTreeNode *node, /* Pointer to some tree node */
char *code, /* The *current* code in progress */
char *symCodes[256], /* The array to hold the codes for all the symbols */
int depth) /* How deep in the tree we are (code length) */
{
printf("Test");
char *copiedCode;
int i;
if(isLeaf(node))
{
code[depth] = 2;
for(i = 0; i < depth; i++)
{
symCodes[node->symbol] = code;
}
}
copiedCode = (char *) malloc(255*sizeof(char));
memcpy(copiedCode, code, 255*sizeof(char));
code[depth] = 0;
makeCodes(node->left, code, symCodes, depth+1);
copiedCode[depth] = 1;
makeCodes(node->right, copiedCode, symCodes, depth+1);
free(copiedCode);
}
我主要调用此函数,这里唯一重要的是我的
makeCodes()
变量并调用函数makeCodes
:void encodeFile(FILE* in, FILE* out)
{
int top = 0;
int i;
char *code;
char *symCodes[256] = {0};
int depth = 0;
getFileFreq(in, out);
buildSortedList();
printCodes(buildHuffmanTree(globalSortedLL), globalUsedCh, top);
makeCodes(buildHuffmanTree(globalSortedLL), code, symCodes, depth);
/*test stuff
struct HuffmanTreeNode* tree;
tree = newNode('Q', 1);
insert(tree, 'A', 5);
insert(tree, 'b', 12);
insert(tree, 'd', 4);
insert(tree, 'l', 6);
insert(tree, 'e', 2);
insert(tree, 'f', 3);
insert(tree, 'h', 7);
printf("Test tree: ");
printList(tree);
end of test stuff*/
}
最佳答案
code
是未初始化的指针。第一次使用它时,它将作为参数传递到makeCodes
中,然后注入到您的symCodes
表中。
数组已在堆栈上分配。指针只是对内存中某处的引用。您必须将其指向已分配的内容。
–稻
关于c - 如何正确使用memcpy而不出现段错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40988777/