如何正确使用memcpy而不出现seg故障?
我目前正在做一个哈夫曼编码程序。我有一个名为huffencode.c的文件,然后通过一个标题链接到下面的主函数encodeFile() 下面的函数makeCodes()使用如何正确使用memcpy而不出现seg故障?,c,segmentation-fault,memcpy,C,Segmentation Fault,Memcpy,我目前正在做一个哈夫曼编码程序。我有一个名为huffencode.c的文件,然后通过一个标题链接到下面的主函数encodeFile() 下面的函数makeCodes()使用memcpy在线路上给我一个Seg故障。我在运行gdb时得到一个SIGSEGV,表示\u memcpy\u sse2\u未对齐 函数MaCeCODE()被调用在可以考虑这个文件的主目录中, EnCODE文件()/。我正在传递makeCodes()一个在另一个正常工作的函数中构建的排序链表,一个用于保存当前生成代码的char指针
memcpy
在线路上给我一个Seg故障。我在运行gdb时得到一个SIGSEGV,表示\u memcpy\u sse2\u未对齐
函数MaCeCODE()被调用在可以考虑这个文件的主目录中,<代码> EnCODE文件()/<代码>。我正在传递makeCodes()一个在另一个正常工作的函数中构建的排序链表,一个用于保存当前生成代码的char指针,一个用于保存每个符号的代码的symCodes数组,以及huffmanTree的深度
makeCodes()应该按照huffman cdoing算法的预期工作,如果当前节点不是叶子,则我向左横向添加代码0,向右横向添加代码1。如果节点是叶,则表示我已到达一个符号,并且该符号的当前代码已完成,我可以通过节点符号将该代码添加到其正确位置
为了让代码的版本同时运行,以便我可以一次遍历所有树,我正在尝试malloc内存以获取当前代码的副本,我将copiedCode的大小设置为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);
}
code
是未初始化的指针。第一次使用它时,它会作为参数传递到makeCodes
,然后泵入symCodes
表中。已在堆栈上分配了一个数组。指针只是对内存中某个地方的引用。你必须把它指向已经分配的东西。
–paddy
code
是一个未初始化的指针。第一次使用它时,它会作为参数传递到makeCodes
,然后泵入symCodes
表。你认为会发生什么?code[depth]=2代码>和memcpy(复制代码,代码,255*sizeof(char))代码>。你在哪里初始化代码?哦。。。当时我对指针的理解有点错误。我道歉。那么,一个将被视为数组的指针需要进行malloced,以便它在堆中有空间容纳它?但是已经用指定索引数组[20]初始化的数组不必是malloced?正确的。已在堆栈上分配了一个数组。指针只是对内存中某个地方的引用。你必须把它指向已经分配的东西。
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*/
}