gpt4 book ai didi

c - 如何正确使用 memcpy 而不会出现段错误?

转载 作者:行者123 更新时间:2023-11-30 19:10:42 25 4
gpt4 key购买 nike

我目前正在开发霍夫曼编码程序。我有一个名为 huffencode.c 的文件,然后通过 header 通过下面的主函数encodeFile() 进行链接。

下面的函数 makeCodes() 在使用 memcpy 的线路上给我一个 Seg 错误。当我运行 gdb 时,我收到一个 SIGSEGV,表示 __memcpy_sse2_unaligned

函数 makeCodes() 正在被调用,您可以认为该函数是该文件的主要部分,encodeFile()。我向 makeCodes() 传递了一个内置于另一个工作正常的函数中的排序链表、一个用于保存当前正在生成的代码的 char 指针、一个用于保存每个符号的代码的 symCodes 数组以及 huffmanTree 的深度.

makeCodes() 应该按 huffman cdoing 算法的预期工作,如果当前节点不是叶子,我横向左添加代码 0,横向右添加代码 1。如果节点是叶,我已经到达一个符号,并且该符号的当前代码已完成,我可以通过节点符号将该代码添加到其正确位置。

为了必须同时运行代码的多个版本,以便我可以一次遍历整个树,我尝试为当前代码的副本分配内存,并且将复制的代码的大小设置为为 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 中,然后注入(inject)到 symCodes 表中。
堆栈上已经分配了一个数组。指针只是对内存中某个位置的引用。您必须将其指向已分配的内容。 – 稻田

关于c - 如何正确使用 memcpy 而不会出现段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40988777/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com